2016-06-02 1 views
1

Предположим, у нас есть некоторые JRadioButton s, который принадлежит к тому же ButtonGroup, когда пользователь нажимает на JRadioButton, он был выбран. Я хочу добавить функцию, которая, когда пользователь нажимает на уже выбранный JRadioButton, становится неактуальным, то есть целое ButtonGroup не будет иметь JRadioButton. Я уже искал, что приводит меня hint к использованию, ButtonGroup метод, clearВыбор. но проблема в том, что, когда пользователь нажимает на уже выбранный JRadioButton, он не генерирует никакого ItemStateChangeEvent, который генерируется щелчком по другим невыбранным JRadioButton s.Как отменить выбор уже выбранного JRadioButton, щелкнув по нему

+0

Guess: вы не 'должен', чтобы снять выделение с радиокнопку, для этой цели использовать флажок – Kennet

+0

Возможный дубликат [* Отмена выбора RadioButtons в Java Swing *] (http://stackoverflow.com/q/2408689/230513). Поскольку нажатие недоступно, отредактируйте свой вопрос, чтобы указать, что вы описали еще один пользовательский жест (ы). – trashgod

+0

Позвольте мне прояснить это для вас, если buttonGroup допускает 4 JRadioButtons, из которых третий JRadioButton уже выбран. Затем снова нажмите 3-й JRadioButton. Он должен очистить выбор третьего JRadioButton. – Ronaldo7

ответ

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); 
    }); 
    } 
} 
+0

Спасибо, @aterai, вот что я ищу ... – Ronaldo7

+0

Мастерство! Протестировано с помощью 'com.apple.laf.AquaLookAndFeel' и прослушивателя привязки клавиш и мыши, предложенного здесь (http://stackoverflow.com/a/37599961/230513). – trashgod

2

Я бы использовал подход cited. Поскольку JRadioButton - это JToggleButton, жест мыши может быть проблематичным. Я использовал бы MouseListener на закрывающей панели и Key Bindings на кнопках, как показано ниже. Нажмите на панели вокруг кнопок или нажмите клавишу , чтобы очистить выбор всех кнопок в ButtonGroup.

image

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); 
    } 
}