2013-09-07 2 views
0

При попытке узнать события JButton я запутался из-за проблемы. Пример кода, который я использую, - here.Проблема Java Swing, почему changeEvent запускает дополнительные события с помощью jButton?

код ниже:

jb.addChangeListener(new ChangeListener() 
{ 
    @Override 
    public void stateChanged(ChangeEvent e) 
    { 
     System.out.println("Changed"); 
    } 
}); 

Это демо-приложение, поэтому используется только одна кнопка, и она имеет фокус, когда приложение запускается. Я просто нажимаю клавишу пробела, чтобы имитировать событие щелчка. Согласно учебнику (OReilly: Java Swing), он должен запустить событие изменения дважды, за которым следует событие действия, за которым следует событие действия. т.е.

  1. Изменено
  2. Изменено
  3. ActionEvent
  4. Изменено

Но после 4-го мероприятия я получил еще ChangeEvent. На самом деле существует 5 событий за один клик, как указано выше. Если я пытаюсь щелкнуть мышью, результат будет еще более разным. Когда мышь входила в область кнопки, событие срабатывало.

Я не знаю, какие изменения происходят, и ChangeEvent поднимается, когда мышь нависает над JButton. Я не нашел аналогичный метод, например getChangedState (ItemStageChanged) для JButton, чтобы узнать, какое состояние было изменено в этой кнопке. Поскольку речь идет об обучении, я не хочу использовать ActionListener, если я не понимаю эту проблему.

Так что мои вопросы:

  1. Почему я вижу ChangeEvent дважды, где он должен быть один?
  2. Как узнать, какое состояние изменилось в JButton?

Редактировать: Я вижу, что в DefaultButtonModel есть 5 состояний, и они определены в интерфейсе ButtonModel. Но у JButton нет полей, методов для получения этих состояний. они охотно игнорировались? Или JButton (и AbstractButton) не связаны с интерфейсом ButtonModel.

Edit 2: Учебное пособие показывает,

В зависимости от L & F, также могут быть дополнительные ChangeEvents.

Я использую значение Swing по умолчанию L & F в Windows, но я получаю разные результаты, кроме ожиданий учебника.

+2

Вы пытаетесь узнать, как использовать 'JButton' или как использовать' ChangeListener'? Я спрашиваю, потому что все время я кодировал Java, я никогда не нашел причины добавлять кнопку «ChangeListener» к кнопке. «ActionListener» - это обычный способ пойти. –

+0

Изучая главу JButton, я получил это. Однако я не хочу игнорировать его **, даже если он не используется ** много. – Jones

+1

Согласитесь с Андреем. В любом случае я бы начал с учебников Swing для объяснения/примеров в [Как написать слушателя] (http://docs.oracle.com/javase/tutorial/uiswing/events/handling.html). В вашем случае вы получаете одно событие, когда выбрана кнопка, и одно событие, когда оно не выбрано. – camickr

ответ

2

пять событий, которые происходят при нажатии кнопки в порядке являются: ChangeEvent: Вооруженный - истинный ChangeEvent: прессованная - истинный ActionEvent ChangeEvent: прессованные - ложь ChangeEvent: Вооруженный - ложь

Если вы используете мышь, чтобы нажимать кнопку, а в дополнение к вышесказанному, будет вариант ChangeEvent для опрокидывания: true, когда мышь перемещается по кнопке, а другая для Rollever: false, когда мышь отходит от кнопки.