Почему в моем DocumentListener вызывается функция insertUpdate, когда я меняю фокус? (Ява Свинг)

У меня есть 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 не должен запускать события прослушивателя документов, меняя фокус...


person smuggledPancakes    schedule 06.01.2011    source источник


Ответы (3)


У вас должно быть что-то, смотрящее в фокус, иначе вы думаете, что оно срабатывает, а это не так.

Я взял ваш код и сделал полный пример, и у него нет описанной вами проблемы.

        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);
person jzd    schedule 06.01.2011
comment
Я думаю, что JGoodies Binding как-то меня смущает. Это должно быть причиной того, что DocumentListener запускает insertUpdate, даже когда я просто меняю фокус. Вероятно, это связано с тем, что я использую буферизованный ввод JGoodies и триггер, который позволяет мне легко сбросить ввод. Есть специалисты по переплету JGoodies? - person smuggledPancakes; 06.01.2011

Вы смотрели на DocumentEvent, чтобы увидеть, какую информацию он содержит? Действительно ли он содержит строку, которая изменилась. Или это просто событие со строкой длины 0. Если это последнее, то, возможно, вы можете просто игнорировать этот случай.

person camickr    schedule 06.01.2011

Я понял. Это на 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 Binding, у меня есть ValueModel, поддерживающий мой JTextField. Слушатель должен быть установлен там, а не в JTextField.

person smuggledPancakes    schedule 06.01.2011