Предположим, у нас есть некоторые JRadioButton
s, который принадлежит к тому же ButtonGroup
, когда пользователь нажимает на JRadioButton
, он был выбран. Я хочу добавить функцию, которая, когда пользователь нажимает на уже выбранный JRadioButton
, становится неактуальным, то есть целое ButtonGroup
не будет иметь JRadioButton
. Я уже искал, что приводит меня hint к использованию, ButtonGroup
метод, clearВыбор. но проблема в том, что, когда пользователь нажимает на уже выбранный JRadioButton, он не генерирует никакого ItemStateChangeEvent
, который генерируется щелчком по другим невыбранным JRadioButton
s.Как отменить выбор уже выбранного JRadioButton, щелкнув по нему
1
A
ответ
2
Или, в качестве альтернативного подхода, переопределения ButtonGroup#setSelected(...)
:
import java.awt.*;
import java.util.Arrays;
import javax.swing.*;
public class Test2 {
public JComponent makeUI() {
JPanel p = new JPanel(new GridLayout(2, 1));
p.add(makePanel("Default ButtonGroup", new ButtonGroup()));
p.add(makePanel("Custom ButtonGroup", new ButtonGroup() {
private ButtonModel prevModel;
private boolean isAdjusting = false;
@Override public void setSelected(ButtonModel m, boolean b) {
if (isAdjusting) {
return;
}
if (m.equals(prevModel)) {
isAdjusting = true;
clearSelection();
isAdjusting = false;
} else {
super.setSelected(m, b);
}
prevModel = getSelection();
}
}));
return p;
}
private JComponent makePanel(String title, ButtonGroup g) {
JPanel p = new JPanel();
p.setBorder(BorderFactory.createTitledBorder(title));
for (String s: Arrays.asList("aaa", "bbb", "ccc")) {
AbstractButton r = new JRadioButton(s);
//AbstractButton r = new JToggleButton(s);
p.add(r);
g.add(r);
}
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new Test2().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
2
Я бы использовал подход cited. Поскольку JRadioButton
- это JToggleButton
, жест мыши может быть проблематичным. Я использовал бы MouseListener
на закрывающей панели и Key Bindings на кнопках, как показано ниже. Нажмите на панели вокруг кнопок или нажмите клавишу , чтобы очистить выбор всех кнопок в ButtonGroup
.
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.KeyStroke;
/**
* @see https://stackoverflow.com/a/37599961/230513
*/
public class Test {
private static final String UNSELECT = "UNSELECT";
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new GridLayout(1, 0, 5, 5));
p.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
ButtonGroup group = new ButtonGroup();
JRadioButton r1 = create("One", group);
JRadioButton r2 = create("Two", group);
p.add(r1);
p.add(r2);
p.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
group.clearSelection();
}
});
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private JRadioButton create(String name, ButtonGroup group) {
JRadioButton b = new JRadioButton(name);
group.add(b);
b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), UNSELECT);
b.getActionMap().put(UNSELECT, new AbstractAction(UNSELECT) {
@Override
public void actionPerformed(ActionEvent e) {
group.clearSelection();
}
});
return b;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
Guess: вы не 'должен', чтобы снять выделение с радиокнопку, для этой цели использовать флажок – Kennet
Возможный дубликат [* Отмена выбора RadioButtons в Java Swing *] (http://stackoverflow.com/q/2408689/230513). Поскольку нажатие недоступно, отредактируйте свой вопрос, чтобы указать, что вы описали еще один пользовательский жест (ы). – trashgod
Позвольте мне прояснить это для вас, если buttonGroup допускает 4 JRadioButtons, из которых третий JRadioButton уже выбран. Затем снова нажмите 3-й JRadioButton. Он должен очистить выбор третьего JRadioButton. – Ronaldo7