[英]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.