Java KeyListener не работает на JSpinner - PullRequest
5 голосов
/ 06 октября 2010

попробовал несколько разных подходов к этому, но пока безуспешно. Просто подумал, что я что-то упустил. У меня есть JSpinner, который является компонентом виджета DateSelector вместе с календарем. Я пытаюсь запустить метод проверки, если пользователь изменяет какой-либо текст в JSpinner вместо использования элемента управления Calendar или JSpinner со стрелками вверх и вниз.

Вот различные подходы, которые я пробовал:

jSpinner1.addKeyListener(kl);

jSpinner1.getEditor().addKeyListener(kl);

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

У кого-нибудь есть идеи о том, что я делаю неправильно? Спасибо

UPDATE Извините, я должен был сказать, что я уже добавил ChangeListener в JSpinnerDateModel, который присоединен к JSpinner. Вот так:

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);

Спасибо

Frank

Ответы [ 3 ]

13 голосов
/ 06 октября 2010

Если вы хотите отключить редактирование клавиатуры, сделайте следующее:

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) {                    
            }

        });
2 голосов
/ 10 апреля 2013

Это нехватка колебаний, и, по моему мнению, JSpinner должен следовать JComboBox в предоставлении следующего доступа к базовому текстовому полю:

JComboBox.getEditor().getEditorComponent()

Изучив источник J1.7, я обнаружил, что с помощью

можно добиться почти одинаковых результатов.
JSpinner.getEditor().getComponent(0)

Поэтому вы можете «взломать» слушателя следующим образом:

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

Очевидно, что это зависит от реализации Swing «под прикрытием» и работает как в J1.7, но нет никакой гарантии, что это работает для других версий в будущем или в прошлом.

Наслаждайтесь.

EDIT

или, если редактор является экземпляром DefaultEditor, вы можете привести его как таковой и использовать 'getTextField ()'. Было бы удобно, если бы это было определено в интерфейсе.

2 голосов
/ 06 октября 2010

JSpinners сами обрабатывают KeyEvents, но запускают ChangeEvents во внешний мир. Добавление ChangeListener должно позволить вам выполнить необходимую проверку.

См. Также: Обнаружение изменений значения счетчика (Java Tutorials)

...