简体   繁体   English

如何通过单击取消选择已选择的JRadioButton

[英]How to deselect already selected JRadioButton by clicking on it

Let's say we are having some JRadioButton s which belongs to same ButtonGroup , when user clicks on a JRadioButton it got selected. 比方说,我们现在遇到了JRadioButton属于同一个S ButtonGroup ,当用户点击JRadioButton它得到了选择。 I want to add a feature that when user click on already selected JRadioButton , it gets deselected, that is whole ButtonGroup will have no JRadioButton selected. 我想添加一个功能,当用户单击已经选择的JRadioButton ,它将被取消选择,即整个ButtonGroup都不会选择JRadioButton I already searched which leads me hint to use, ButtonGroup method, clearSelection. 我已经搜索过,这使我获得使用提示 ,即ButtonGroup方法,clearSelection。 but problem is that when user clicks on already selected JRadioButton, it is not generating any ItemStateChangeEvent , which is generating by clicking on other unselected JRadioButton s. 但是问题在于,当用户单击已经选择的JRadioButton时,它不会生成任何ItemStateChangeEvent ,而该ItemStateChangeEvent是通过单击其他未选中的JRadioButton的。

I'd use the approach cited . 我会使用引用的方法。 Because a JRadioButton is a JToggleButton , a mouse gesture is possible but problematic. 因为JRadioButtonJToggleButton ,所以鼠标手势是可能的但有问题。 I'd use a MouseListener on the enclosing panel and Key Bindings on the buttons as shown below. 我将在封闭面板上使用MouseListener ,并在按钮上使用键绑定 ,如下所示。 Click in the panel surrounding the buttons or press the escape key to clear the selection of all buttons in the ButtonGroup . 在按钮周围的面板中单击,或按退出键以清除ButtonGroup中所有按钮的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);
    }
}

Or, as an alternate approach, override ButtonGroup#setSelected(...) : 或者,作为替代方法,重写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);
    });
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM