繁体   English   中英

更改焦点时,为什么在DocumentListener中调用insertUpdate? (Java秋千)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM