【发布时间】:2017-11-28 09:34:39
【问题描述】:
我制作了一个文档监听器,它会在插入文本时调用一个方法。它可以工作,但问题是它就像在循环中一样,并且一直被调用。
该方法使用方法内部的 swingutilties.invokelater。
private void addNewLine() {
SwingUtilities.invokeLater( () -> {
textArea.append(System.getProperty("line.separator")+"hey");
});
}
private final DocumentListener addNewLine = Handlers.forDocumentUpdate((event) -> {
addNewLine();
});
@SuppressWarnings("serial")
static DocumentListener forDocumentUpdate(Consumer<? super DocumentEvent> eventHandler) {
return new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent event) {
eventHandler.accept(event);
}
@Override
public void removeUpdate(DocumentEvent event) {
}
@Override
public void changedUpdate(DocumentEvent event) {
}
};
}
【问题讨论】:
-
不要从
DocumentListener中更新Document,这可能会导致突变异常,或者您似乎已经发现,其他异常行为。相反,请考虑使用DocumentFilter -
与其试图找到解决问题的“解决办法”,不如先用最适合该工作的工具来解决它,看看TransferHandler
-
好吧,通过 TransferHandler 来做会很浪费,因为当我真的想运行一行代码时,我必须重写很多代码。我试图通过 TransferHandler 来做几个小时。我对 documentfilter 不是很熟悉,但我会看看它。我认为如果它可能忽略过滤器所做的任何更改会更好。
标签: java swing loops invokelater swingutilities