DocumentListener 方法被重复调用
DocumentListener method being called repeatedly
我制作了一个文档监听器,它会在插入文本时调用一个方法。它可以工作,但问题是它的行为就像在循环中一样,并且一直被调用。
该方法使用方法内部的 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做任务,但是递归循环有问题。正确的方法是添加一个 DocumentFilter,它将简单地添加一个换行符以及插入要插入的原始文本的代码。
((AbstractDocument) textArea.getDocument()).
setDocumentFilter(new NewLineFilter());
public class NewLineFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb,int offs,String str,AttributeSet a)
throws BadLocationException {
}
@Override
public void replace(FilterBypass fb, int offs,int length, String str, AttributeSet a)
throws BadLocationException {
System.out.println("in replace");
super.replace(fb,offs,length,str,a);
super.insertString(fb, fb.getDocument().getLength(), System.lineSeparator(), a);
}}
如果您知道更好的编写方法,或者如果您知道制作处理程序的方法可以为此创建匿名 class,那就太好了。我无法使用 Consumer,因为 replace() 有多个参数。我可以制作另一个功能界面,但我不知道它会有多大用处。我认为如果我需要再次使用相同的东西,可能会重复使用这个 class。
我制作了一个文档监听器,它会在插入文本时调用一个方法。它可以工作,但问题是它的行为就像在循环中一样,并且一直被调用。
该方法使用方法内部的 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做任务,但是递归循环有问题。正确的方法是添加一个 DocumentFilter,它将简单地添加一个换行符以及插入要插入的原始文本的代码。
((AbstractDocument) textArea.getDocument()).
setDocumentFilter(new NewLineFilter());
public class NewLineFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb,int offs,String str,AttributeSet a)
throws BadLocationException {
}
@Override
public void replace(FilterBypass fb, int offs,int length, String str, AttributeSet a)
throws BadLocationException {
System.out.println("in replace");
super.replace(fb,offs,length,str,a);
super.insertString(fb, fb.getDocument().getLength(), System.lineSeparator(), a);
}}
如果您知道更好的编写方法,或者如果您知道制作处理程序的方法可以为此创建匿名 class,那就太好了。我无法使用 Consumer,因为 replace() 有多个参数。我可以制作另一个功能界面,但我不知道它会有多大用处。我认为如果我需要再次使用相同的东西,可能会重复使用这个 class。