当DocumentFilter没有收听更改时,我该怎么办?

时间:2013-11-24 18:46:59

标签: java swing jtextarea documentfilter

您好我有以下代码:

      AbstractDocument d = (AbstractDocument)editorText.getDocument();
      d.setDocumentFilter(new myFilter());

其中editorText是JTextArea。我的DocumentFiler定义如下:

private class myFilter extends DocumentFilter{
       public void insertString(DocumentFilter.FilterBypass fb,
               int offset,
               String string,
               AttributeSet attr){
           System.out.print("insert invoked");
                 try {
                    super.insertString(fb, offset, "; You inserted the string: "+string, attr);
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
       }
       public void replace(DocumentFilter.FilterBypass fb,
               int offset,
               String string,
               AttributeSet attr){
           System.out.print("replace invoked");
             try {
                super.insertString(fb, offset, "; You inserted the string: "+string, attr);
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
       }
   }

我希望代码的工作方式如下:如果输入了一个字符,那么预期的是insertString函数必须触发,屏幕上必须看到的是;你插入了字符串:。不是这种情况。我应该怎么做才能使程序触发每个按下的字符并处理它并显示在屏幕上?

1 个答案:

答案 0 :(得分:3)

检查您是否以所需方式“覆盖”DocumentFilter的所有方法。至少在方法replace(...)中,我注意到您错过了int length参数。我建议将其更改为:

public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr){
  System.out.print("replace invoked");
  try {
    super.insertString(fb, offset, "; You inserted the string: "+string, attr);
  } catch (BadLocationException e) {
    e.printStackTrace();                                                                                                                                                            
  }                                                                                                                                                                                   
}