5

これに対していくつかの異なるアプローチを試みましたが、これまでのところ成功していません。私は何かが足りないのだろうかと思った。カレンダーと一緒にDateSelectorウィジェットのコンポーネントであるJSpinnerがあります。ユーザーがカレンダーコントロールまたはJSpinnerの上下の矢印を使用する代わりに、JSpinnerのテキストを変更した場合に、検証メソッドを起動しようとしています。

これが私が試したさまざまなアプローチです:

jSpinner1.addKeyListener(kl);

jSpinner1.getEditor().addKeyListener(kl);

((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);

誰かが私が間違っていることについて何かアイデアを持っていますか?ありがとう

UPDATE 申し訳ありませんが、JSpinnerに接続されているJSpinnerDateModelにChangeListenerをすでに追加していると言っておく必要があります。そのようです:

ChangeListener changeListener = new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            dateChanged();
        }
    };

    jSpinnerDateModel.addChangeListener(changeListener);

    KeyListener keyListener = new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
            dateChanged();
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub

        }

    };
    ((JSpinner.DefaultEditor) jSpinner1.getEditor()).getTextField().addKeyListener(
            keyListener);

ありがとう

フランク

4

3 に答える 3

14

キーボード編集を無効にする場合は、次のようにします。

JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);

重要なイベントをリッスンするには、テキストフィールドにリスナーを追加する必要があります。これは私のために働きます:

((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyListener(){

            @Override
            public void keyPressed(KeyEvent e) {                    
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("PRESSED!");                    
            }

            @Override
            public void keyTyped(KeyEvent e) {                    
            }

        });
于 2010-10-06T15:05:23.643 に答える
2

JSpinnerはKeyEvents自体を処理しますが、ChangeEventsを外部に起動します。ChangeListenerを追加すると、必要な検証を実行できるようになります。

参照:スピナー値の変更の検出(Javaチュートリアル)

于 2010-10-06T15:10:24.280 に答える
2

これはスイングの不足であり、私の意見では、JSpinnerはJComboBoxに従って、基になるテキストフィールドへの次のアクセスを提供する必要があります。

JComboBox.getEditor().getEditorComponent()

J1.7のソースを調べてみると、ほぼ同じことを達成できることがわかりました。

JSpinner.getEditor().getComponent(0)

したがって、次の方法でリスナーを「ハック」できます。

JSpinner.getEditor().getComponent(0).addKeyListener(...)

明らかに、これはスイングの「隠れた」実装に依存し、J1.7と同様に機能しますが、これが将来または過去の他のバージョンで機能するという保証はありません。

楽しみ。

編集

または、エディターがDefaultEditorのインスタンスである場合は、そのようにキャストして「getTextField()」を使用できます。これがインターフェースで定義されていれば便利です。

于 2013-04-09T23:12:11.433 に答える