我有一个JTextField
,我需要在其中编辑或添加新内容到文本字段中。能够在使用文档侦听器但不能设置文本之后获取文本。它会抛出错误,如
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException:
Attempt to mutate in notification
我的代码:
t_pageno.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
warn();
}
@Override
public void removeUpdate(DocumentEvent e) {
warn();
}
@Override
public void insertUpdate(DocumentEvent e) {
warn();
}
public void warn() {
if (
Integer.parseInt(t_pageno.getText()) > Integer.parseInt(Config.maxpageno)
&&
Integer.parseInt(t_pageno.getText()) < 0
) {
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0 and less than "+Config.maxpageno, "Error Massage",
JOptionPane.ERROR_MESSAGE);
}
else
{
String pageno = t_pageno.getText();
if (!pageno.equals(new File(Current_index).getName().substring(18, 20))) {
int Storyidconfirm = JOptionPane.showConfirmDialog(null, "Do You want to change the Page No", "Change PageNo", JOptionPane.YES_NO_OPTION);
if (Storyidconfirm == JOptionPane.YES_OPTION) {
String newidchange = new File(Current_index).getName().substring(0, 18) + pageno + new File(Current_index).getName().substring(21, new File(Current_index).getName().length());
JOptionPane.showMessageDialog(null, "Change in page no ??????????");
}
else
{
JOptionPane.showMessageDialog(null, "Reversing to old page no");
JOptionPane.showMessageDialog(null, "new File(Current_index).getName().substring(18, 20) --> "+new File(Current_index).getName().substring(18, 20));
t_pageno.setText(new File(Current_index).getName().substring(18, 20).toString());
}
}
}
}
});
答案 0 :(得分:2)
DocumentListener
不是尝试对Document
进行修改的好地方,因为在通知时,Document
处于变异状态,因此任何尝试进一步修改它会导致它抛出IllegalStateException
如果要在文本提交到Document
之前更改或过滤文本,则应使用DocumentFilter
代替,这就是它的设计目标。
有关详细信息,请参阅Implementing a Document Filter和DocumentFilter Examples。
当您希望在DocumentListener
已经提交Document
之后收到Document
的更改通知时,您应该只使用Document
,并且永远不要尝试使用它来过滤或以其他方式修改ActionListener
我强烈建议您不要在每次更新时显示警报,因为这会让人烦恼。相反,我会以某种方式突出显示该字段,指示值值无效(可能提供工具提示以获取更多信息)和/或更新某种状态值/标签。我可能会考虑使用InputVerifier
和/或JSpinner
来执行物理验证,然后向用户显示错误,因此他们在输入和更正之前可能会犯错误采取行动。
我还建议您查看{{1}}
有关详细信息,请参阅How to Write an Action Listeners,Validating Input和How to Use Spinners