Почему insertUpdate вызывается в моем DocumentListener, когда я меняю фокус? (Java Swing) - PullRequest
1 голос
/ 06 января 2011

У меня есть 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 ]

1 голос
/ 06 января 2011

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

1 голос
/ 06 января 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.

1 голос
/ 06 января 2011

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

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

        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);
...