【问题标题】:Why does insertUpdate get called in my DocumentListener when I change focus? (Java Swing)当我改变焦点时,为什么在我的 DocumentListener 中调用 insertUpdate? (Java 摇摆)
【发布时间】:2011-06-04 17:37:33
【问题描述】:

我有一个带有 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 不应该通过改变焦点来触发文档侦听器事件...

【问题讨论】:

    标签: java swing document listener jgoodies


    【解决方案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);
    

    【讨论】:

    • 我认为 JGoodies Binding 不知何故把我搞砸了。即使我只是改变焦点,它也一定会导致 DocumentListener 触发 insertUpdate。这可能与我使用 JGoodies 缓冲输入的面部和允许我轻松重置输入的触发器有关。有没有 JGoodies 绑定专家?
    【解决方案2】:

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

    【讨论】:

      【解决方案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 Binding,因此我有一个 ValueModel 支持我的 JTextField。侦听器必须在那里设置,而不是在 JTextField 上。

      【讨论】:

        猜你喜欢
        • 2015-10-28
        • 2016-01-28
        • 2013-08-08
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-02
        相关资源
        最近更新 更多