2011-06-15 56 views
2

我有一個JTextField,我想限制爲15個字符。問題是,當我輸入超過15個字符時,它會出錯。我怎樣才能解決這個問題?我必須使用其他對象嗎?DocumentListener出錯

錯誤: 異常在線程 「AWT-EventQueue的 - 0」 java.lang.IllegalStateException:嘗試在通知變異

final int maxNicknameLength = 15; 
final JTextField nickname = new JTextField(1); //Max length: 15 
DocumentListener docListen = new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
      lengthCheck(e, nickname, maxNicknameLength); 
     } 

     public void insertUpdate(DocumentEvent e) { 
      lengthCheck(e, nickname, maxNicknameLength); 
     } 

     public void removeUpdate(DocumentEvent e) { 
      lengthCheck(e, nickname, maxNicknameLength); 
     } 
     public void lengthCheck (DocumentEvent e, JTextField txt, int max) { 
      if (txt.getText().length() > max) 
       txt.setText(txt.getText().substring(0, max)); 
     }  
}; 
nickname.getDocument().addDocumentListener(docListen); 

回答

8

使用某個DocumentFilter,不是DocumentListener。在聽者開槍時,文檔已經更新。過濾器將防止文檔被更新。

請參閱:Implementing a Document Filter以瞭解您需要的工作示例。

+0

做了一些工作,但我設法使用該實現。 – Jack 2011-06-15 01:46:29

3

試試這個:

public void lengthCheck(final DocumentEvent e, final JTextField txt, 
     final int max) { 
    if (txt.getText().length() > max) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       txt.setText(txt.getText().substring(0, max)); 
      } 
     }); 
    } 
} 
+3

+1,解決方案回答了問題。但是,這不是要求的最佳解決方案。使用DocumentFilter來獲得更好的解決方案。 – camickr 2011-06-15 01:16:34

+0

儘管它起作用,但如果DocumentFilter是我應該使用的,我將使用它。 – Jack 2011-06-15 01:45:37

1

從Java tutorial

You may want to change the document's text within a document listener. However, you should never modify the contents of a text component from within a document listener. If you do, the program will likely deadlock. Instead, you can use a formatted text field or provide a document filter.

有潛在Document上同步鎖,並且該鎖採取監聽,當你lengthCheck方法內。在JTextField上撥打setText也會嘗試抓住Document上的鎖定,這是不可能的。