Я подумал, что лучший способ продемонстрировать это на компилируемом примере.Я хочу иметь группу переключателей, которые ведут себя как таковые (можно выбрать только одну);однако, когда выбранный в настоящий момент переключатель снова «выбран», выбор очищается (как я полагаю, флажок).
Моя реализация проверяет состояние переключателя и, если он выбран, очищает выбор (эмулируя «отмена выбора» как флажок).Проблема в том, что состояние выбора переключателя изменяется до срабатывания ActionEvent
, поэтому isSelected()
возвращает true независимо от того, был ли он уже выбран.Одним из решений было бы, по сути, регистрировать выбранную кнопку ButtonGroup непосредственно перед любым срабатыванием ActionEvent, хотя моя программа не такая экстрасенсорная :( Я подозреваю, что мог бы легко реализовать это, используя MouseListener
, хотя это ограничивает функциональность использованием мыши,и я мог бы использовать клавиатуру и т. д. :) Спасибо за любые указатели!
Демо:
package sandbox;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
public class Sandbox {
public static void main(String[] args) {
JFrame f = new JFrame();
final ButtonGroup btns = new ButtonGroup();
final JRadioButton btn1 = new JRadioButton("Button 1");
final JRadioButton btn2 = new JRadioButton("Button 2");
btns.add(btn1);
btns.add(btn2);
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JRadioButton) {
btns.clearSelection();
}
}
};
btn1.addActionListener(al);
btn2.addActionListener(al);
f.setLayout(new FlowLayout());
f.add(btn1);
f.add(btn2);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}