Почему insertUpdate вызывается в моем DocumentListener, когда я меняю фокус? (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, который, как я начинаю верить, является корнем этой проблемы. Swing без JGoodies не должен запускать события слушателя документа, меняя фокус...
3 ответа
Я понял. Это на 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.
Вы смотрели на DocumentEvent, чтобы увидеть, какую информацию он содержит? Содержит ли она на самом деле строку, которая изменилась. Или это просто событие со строкой 0 длины. Если это последнее, то, возможно, вы можете просто проигнорировать этот случай.
Вы должны что-то смотреть на фокус, или вы думаете, что это стреляет, а это не так.
Я взял ваш код и сделал полный пример, в котором нет описанной вами проблемы.
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);