簡體   English   中英

DocumentListener 出錯

[英]Error with DocumentListener

我有一個 JTextField,我希望限制為 15 個字符。 問題是當我輸入超過 15 個字符時,它會出錯。 我怎樣才能解決這個問題? 我是否必須使用其他一些 object?

錯誤:線程“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);

使用 DocumentFilter,而不是 DocumentListener。 到偵聽器觸發時,文檔已經更新。 過濾器將阻止更新文檔。

請參閱: 實現文檔過濾器以獲取滿足您需求的工作示例。

嘗試這個:

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));
            }
        });
    }
}

來自 Java 教程

您可能希望在文檔偵聽器中更改文檔的文本。 但是,您永遠不應該從文檔偵聽器中修改文本組件的內容。 如果這樣做,程序很可能會死鎖。 相反,您可以使用格式化的文本字段或提供文檔過濾器。

底層Document上有一個同步鎖,當在您的lengthCheck方法中時,偵聽器會使用此鎖。 JTextField上調用setText也會嘗試獲取Document上的鎖,這是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM