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 を使用していることにも注意してください。JGoodies を使用しない Swing は、フォーカスを変更してドキュメント リスナー イベントを発生させるべきではありません...

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 を使用しているので、JTextField をサポートする ValueModel があります。リスナーは、JTextField ではなく、そこに設定する必要があります。

于 2011-01-06T16:05:05.153 に答える