1

我有一个带有 documentListener 的 JTextField。当我向此文本字段添加或删除字符时,我想更改背景颜色。我应该正确使用文档侦听器吗?它可以工作,但是当我获得和失去对这个 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 w/o JGoodies 不应该通过改变焦点来触发文档侦听器事件......

4

3 回答 3

1

你必须有东西在看焦点,否则你认为它正在发射,但事实并非如此。

我拿了你的代码并做了一个完整的例子,它没有你描述的问题。

        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);
于 2011-01-06T15:43:21.233 回答
1

您是否查看过 DocumentEvent 以了解它包含哪些信息?它实际上是否包含一个已更改的字符串。或者它只是一个长度为 0 的字符串的事件。如果是后者,那么也许您可以忽略这种情况。

于 2011-01-06T15:53:01.453 回答
1

我想到了。它 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 上。

于 2011-01-06T16:05:05.153 回答