[英]Why does insertUpdate get called in my DocumentListener when I change focus? (Java Swing)
我有一个JTextField,上面有一个documentListener。 我想在此文本字段中添加或删除字符时更改背景颜色。 我应该使用文档监听器正确吗? 它可以工作,但是当我对这个JTextfield失去关注时,它也会触发。 我没有在此JTextField上添加焦点侦听器。 这是我的代码,关于如何解决问题的任何建议?
numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField);
numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e)
{
}
@Override
public void insertUpdate(DocumentEvent e)
{
numPlotRowsJTextField.setBackground(Color.cyan);
}
@Override
public void changedUpdate(DocumentEvent e)
{
}
});
还请注意,我正在使用JGoodies Binding,我开始相信这是此问题的根源。 不使用JGoodies摇摆不应该通过更改焦点来触发文档侦听器事件...
您必须有一些东西在关注焦点,否则您就认为它正在点火,而事实并非如此。
我接受了您的代码并制作了一个完整的示例,它没有您描述的问题。
JFrame frame = new JFrame();
final JTextField numPlotRowsJTextField = new JTextField(3);
numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
numPlotRowsJTextField.setBackground(Color.cyan);
}
@Override
public void removeUpdate(DocumentEvent e) {
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(new JTextField(2));
frame.getContentPane().add(numPlotRowsJTextField);
frame.setVisible(true);
您是否查看过DocumentEvent来查看其中包含的信息? 它实际上是否包含已更改的字符串。 还是仅仅是一个长度为0的字符串的事件。 如果是后者,那么也许您可以忽略这种情况。
我想到了。 100%与JGoodies Binding有关。
此代码有效:
ValueModel valueModelNumberPlotRowsJTextField = adapter.getBufferedModel("numberOfPlotRows");
valueModelNumberPlotRowsJTextField.addValueChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt)
{
numPlotRowsJTextField.setBackground(Color.cyan);
}
});
numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField);
因为我使用的是JGoodies绑定,所以我有一个ValueModel支持我的JTextField。 侦听器必须在此处设置,而不是在JTextField上设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.