【发布时间】:2016-04-17 07:56:19
【问题描述】:
我有一个带有文本字段的 Jpanel。我正在使用 documentListener 将更改保存为用户在文本字段中键入的内容。用户可以输入 1-1000 之间,如果他输入任何其他内容,则会弹出错误消息。 现在,我正在使用invokeLater,但如果用户输入> 1000,则会导致无限循环。我该如何解决这个问题。
mMaxLabelLength = new JTextField();
mMaxLabelLength.getDocument().addDocumentListener(this);
@Override
public void changedUpdate(DocumentEvent arg0)
{
}
@Override
public void insertUpdate(DocumentEvent arg0)
{
saveActions();
mMaxLabelLength.requestFocus();
}
@Override
public void removeUpdate(DocumentEvent arg0)
{
saveActions();
mMaxLabelLength.requestFocus();
}
private boolean saveActions()
{
// get text
String strValue = mMaxLabelLength.getText();
// validate: must be positive integer between 1-1000;
boolean bSaveIt = true;
try
{
int nValue = Integer.parseInt(strValue);
if (nValue < 1 || nValue > 1000)
bSaveIt = false;
}
catch (NumberFormatException ne)
{
bSaveIt = false;
}
// save data to properties if valid
if (bSaveIt)
{
//do something
}
else
{
// error message
JOptionPane.showMessageDialog(this, "Please enter an integer value between 1 and 1000.", "Invalid Entry", JOptionPane.INFORMATION_MESSAGE);
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
int nMaxLabel = getMaxPieLabel();
mMaxLabelLength.setText(new Integer(nMaxLabel).toString());
}
});
return false;
}
setVisible(true);
return true;
}
【问题讨论】:
-
在我看来,当您调用
mMaxLabelLength.setText(...);时,您正在触发insertUpdate... 再次调用setText()。 -
我理解(从我的日志中),mMaxLabelLength.setText(...) 同时调用 removeUpdate 和 insertUpdate ,这就是它进入无限循环的原因。随着 mMaxLabelLength.getText 变为 0。
-
它与“invokeAndWait”一起工作正常,但是当它尝试设置值时,我收到错误消息“无法从事件调度程序线程调用 invokeAndWait”
-
永远不要在 DocumentListener 中修改文档。也许您想使用 InputVerifier。
-
我确实尝试过使用 inputVerifier,但我遇到了同样的已知问题。当我将 inputVerifier 与 Jtabbedpanels 一起使用时。 stackoverflow.com/questions/34726674/…
标签: java swing documentlistener