Обнаружение изменения состояния JRadioButton

Как я могу определить, когда JRadioButton изменяется с «невыбранного» на «выбранный» при щелчке мышью? Я пытался использовать ActionListener на кнопке, но он срабатывает каждый раз, когда нажимается радиокнопка, а не только тогда, когда она меняет состояние на «выбрано».

Я подумал о том, чтобы сохранить логическую переменную, которая запоминает состояние кнопки, и протестировать ее внутри ActionListener, чтобы увидеть, следует ли изменить ее состояние, но мне интересно, есть ли гораздо лучшее или более чистое решение.


person cgull    schedule 15.09.2009    source источник
comment
Да, ActionListner обычно так и делается. Все знают, как написать ActionListener, потому что это очень распространено. Тогда код просто будет использовать метод isSelected() кнопки. ItemListener также срабатывает несколько раз, поэтому вам нужно проверить ItemEvent, чтобы увидеть, было ли это событие выбором или отменой выбора. Я бы придерживался более распространенного подхода.   -  person camickr    schedule 15.09.2009
comment
Использование такого ActionListener по-прежнему не работает, поскольку isSelected() возвращает true каждый раз, когда нажимается переключатель, что и было моей первоначальной проблемой.   -  person cgull    schedule 15.09.2009
comment
У меня отлично работает с JDK6 на XP. Если ChangeListener сообщает вам, что состояние изменилось, то состояние лучше изменить, иначе у вас возникнет большая проблема. Опубликуйте свой SSCCE, показывающий проблему.   -  person camickr    schedule 16.09.2009
comment
@camickr, в своем первом комментарии вы сказали ему использовать ActionListener, а затем, когда он объяснил, что с этим есть проблема, вы прокомментировали так, как будто сказали ему использовать ChangeListener. У обоих этих слушателей есть проблемы, как указано ниже.   -  person Nemi    schedule 02.08.2012


Ответы (2)


Посмотрите на JRadioButton.addItemListener()

РЕДАКТИРОВАТЬ: Маловероятно, что вы захотите использовать changeListener, поскольку он срабатывает несколько раз за клик. ItemListener срабатывает только один раз за клик. см. здесь

РЕДАКТИРОВАТЬ 2: Просто чтобы расширить это, actionListener на jradioButton будет срабатывать каждый раз, когда пользователь нажимает на него, даже если он уже выбран. если это то, что вы хотите, хорошо, но я нахожу это раздражающим. Я только хочу получать уведомления о том, что он выбран или отменен.

ChangeListener будет срабатывать для самых разных вещей, то есть ваш слушатель будет получать 5 или более событий за клик. Фигово.

Слушатель элементов сработает только, если изменится состояние выбора или отмены выбора. Это означает, что пользователь может щелкнуть по нему несколько раз, и он не сработает, если он не изменится. В вашем методе обработчика вам нужно будет иметь блок if, проверяющий статус SELECTED или DESELECTED, и делать там все, что угодно:

@Override
public void itemStateChanged(ItemEvent e) {
    if (e.getStateChange() == ItemEvent.SELECTED) {
        // Your selected code here.
    }
    else if (e.getStateChange() == ItemEvent.DESELECTED) {
        // Your deselected code here.
    }
}

Это просто работает лучше, потому что вы знаете, что если вы находитесь в методе, то переключатель либо только что был выбран, либо не выбран, а не то, что пользователь просто стучит по интерфейсу по какой-то неизвестной причине.

person Nemi    schedule 15.09.2009
comment
Это работает отлично, несмотря на то, что в документации Sun указано, что обычно вы обрабатываете щелчки переключателя с помощью прослушивателя действий. Спасибо! - person cgull; 15.09.2009
comment
Было бы здорово, если бы вы могли добавить прослушиватель к ButtonGroup, который срабатывал бы только один раз при изменении JRadioButton в группе. - person ryvantage; 28.11.2014
comment
@Nemi Извините, но ссылка на редактирование не работает. Можете ли вы предоставить, как использовать этот подход? - person Abraham Putra Prakasa; 20.03.2016
comment
@AbrahamPutraPrakasa Извините, после всего этого времени я даже не уверен, на что я ссылался. Достаточно сказать, что в разделе EDIT2 изложено все, что я хотел сказать о ChangeListener, срабатывающем несколько раз за клик. - person Nemi; 26.07.2016
comment
---ссылка битая---- - person Omore; 06.12.2017
comment
Изменена ссылка на обратный путь - person Nemi; 24.04.2018

Я полагаю, вы хотите добавить реализацию ChangeListener.

person Rob Di Marco    schedule 15.09.2009
comment
Как я упоминал в своем посте, добавление ChangeListener срабатывает несколько раз за клик и вряд ли будет лучшим выбором. - person Nemi; 15.09.2009