对此,通常的回答是“使用文档监听器”,但我总是觉得界面很麻烦。 其实,界面设计过度了。 有三种插入、删除和替换文本的方法,但只需要一种方法。 (插入操作假定用特定文本替换没有文本的文本,而删除操作假定用某些文本而不是文本替换。 )
典型的DocumentListener实现通常有三种方法调用一种方法,因为您只需要知道框中的文本发生了更改。
因此,创建了以下实用程序方法: 可以使用更简单的change监听器,而不是文档监听器。 ()使用Java 8的lambda语法,但如果需要,也可以在旧的Java中使用。 /**
* installsalistenertoreceivenotificationwhenthetextofany
* { @ codejtextcomponent } is changed.internally,itinstallsa
* { @ linkdocumentlistener } onthetextcomponent ' s { @ link document },
* anda { @ linkpropertychangelistener } onthetextcomponenttodetect
* ifthe { @ code document } itselfisreplaced。
*
*@paramtextanytextcomponent,suchasa{@linkJTextField}
*or{@linkJTextArea}
* @ paramchangelisteneralistenertoreceieve { @ linkchangeevent } s
*whenthetextischanged; thesourceobjectfortheevents
*willbethetextcomponent
* @ throwsnulpointerexceptionifeitherparameterisnull
*/publicstaticvoidaddchangelistener (jtextcomponenttext,ChangeListenerchangeListener ) {
objects.requirenonnull(text;
objects.require nonnull (change listener );
documentlistenerdl=newdocumentlistener {
privateintlastChange=0且lastNotifiedChange=0;
@Override
publicvoidinsertupdate (文档版本) {
变更更新(e );
}
@Override
publicvoidremoveupdate (文档版本) {
变更更新(e );
}
@Override
publicvoidchangedupdate (文档版本) {
最后变更;
SwingUtilities.invokeLater (
最后变更(if )!=lastChange ) {
lastNotifiedChange=lastChange;
change监听器. state changed (newchangeevent ) text );
}
);
}
(;
text.addpropertychangelistener (' document ),) PropertyChangeEvente
documentD1=(document ) e.getOldValue );
documentD2=(document ) e.getNewValue );
if(D1!=空(D1.removedocumentlistener ) dl;
if(D2!=null ) D2.adddocumentlistener(dl;
dl.changed update (空;
);
文档d=text.get document (;
if(d!=null(d.adddocumentlistener ) dl; }
与将侦听器直接添加到文档不同,这是为了在文本组件中安装新的文档对象。 另外,也可以解决在此描述的问题。 mmydbl的回答、文档可能会触发比所需事件更多的事件。
无论如何,此方法都可以替换棘手的代码,如some textbox.get document (.adddocumentlistener (newdocumentlistener ) )。
@Override
publicvoidinsertupdate (文档版本) {
doSomething (;
}
@Override
publicvoidremoveupdate (文档版本) {
doSomething (;
}
@Override
publicvoidchangedupdate (文档版本) {
doSomething (;
}; );
有: addchangelistener(sometextbox,e-doSomething ) );
向公共域公开代码。 好好享受!