我有4个复选框作为一个组添加,这样我就只能选择一个复选框。 但是,如果我选择其中一个并且现在想要在组中取消选中所有这些,我就无法做到。任何人都知道我该怎么做?
答案 0 :(得分:4)
你问的行为是半复选框和半无线电按钮,这就是你如何做到这一点:把它做成一组五个单选按钮,其中第一个(或最后一个)基本上说'没有其他选择'。
答案 1 :(得分:2)
您可以使用clearSelection()
,其中“清除选择内容,以便ButtonGroup
中没有任何按钮被选中。”
另外,在单选组中使用JRadioButton
可能比复选框更容易混淆。
附录:@Joe Carnahan和@Chris提出了明确的方法,使“无选择”选择明确。您还可以查看Java Look and Feel Design Guidelines的第10章,其中讨论了与切换按钮相关的独立v。独占选择。
答案 2 :(得分:2)
在@ trashgod的答案的基础上,这是一个可运行的代码示例,其中JButton
被连接起来以使用JRadioButton
清除一组ButtonGroup.clearSelection()
个对象中的选择:
public class ClearableRadioButtons extends JFrame {
public ClearableRadioButtons() {
JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
final ButtonGroup group = new ButtonGroup();
for (int i = 1; i < 10; i++) {
JRadioButton nextButton = new JRadioButton("Button " + i);
group.add(nextButton);
content.add(nextButton);
}
content.add(new JButton(new AbstractAction("Clear") {
public void actionPerformed(ActionEvent arg0) {
// This is the one line you really care about:
group.clearSelection();
}
}));
setLayout(new BorderLayout());
add(content, BorderLayout.CENTER);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ClearableRadioButtons();
}
});
}
}
请注意,如果将JRadioButton
的所有实例替换为JCheckBox
,则此代码同样有效。但是,不推荐这样做,因为标明只能选择一件事的标准方法是使用单选按钮而不是复选框。如果用户看到复选框,通常会允许用户选择多个复选框,当选择其中一个复选框导致其他复选框未被选中时,他们会感到恼火。
如果您真的不喜欢JRadioButton
按钮的外观,那么我建议您使用Swing外观来更改所有的复选框和单选按钮应用程序直到您对结果感到满意为止。
答案 3 :(得分:0)
您正在描述RadioButton
的行为,Container
是一个选择组,只允许在给定时间选择一个选项; Swing已经内置了对此的支持。
要取消选中所有复选框,您可以迭代ButtonGroup.getElements()
个孩子,或者更方便,使用{{1}}枚举特定群组中的按钮。
答案 4 :(得分:0)
<强> - [编辑] - 强>
我犯了一个错误,我回答这个想法是关于我正在阅读的另一个问题的C#.NET项目。如果愿意,可以选择关闭它,但在选择downvote之前请阅读此注释
的 - [/编辑] - 强>
对于你之后所说的,你可以作为复选框的魔杖放射线(重新点击它可以取消检查)。为此,您可以使用radiobuttons
并添加名为“none”的选项,该选项将表现为没有选择任何选项,或者添加一个“清除”按钮来取消选择每个单选按钮。
或者如果您真的想要这样做,您可以使用CheckBox_CheckedChanged
处理程序,每次选中或取消选中复选框时都会触发该处理程序,因此您必须查看处理程序内是否选中了复选框。处理程序中的代码应如下所示:
If (CheckBox1.Checked)
{
CheckBox2.Checked = False;
CheckBox3.Checked = False;
CheckBox4.Checked = False;
CheckBox5.Checked = False;
}
// same for other checkboxes
或者创建一个获取当前选中复选框并取消选中其他复选框的函数,并将其放在每个处理程序中,每个处理程序都会发送所需的复选框。
但我高度会让你选择我给出的第一个解决方案之一。
答案 5 :(得分:0)
这是一个古老的讨论...但我有完全相同的问题,并且不想要一个解决方案解决方案,因为添加“清除选择按钮”。 所以,我编写了自己的ButtonGroup来解决原始问题(可以取消选择一个按钮,使组没有选中按钮)。 它还增加了java.util.Observer观察的能力,每当所选按钮发生变化时都会被通知。
以下是代码:
package net.yapbam.gui.util;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.io.Serializable;
import javax.swing.JToggleButton;
/**
* This class is, like javax.swing.ButtonGroup, used to create a multiple-exclusion scope for
* a set of buttons. Creating a set of buttons with the same <code>ButtonGroup</code> object means that
* turning "on" one of those buttons turns off all other buttons in the group.
* <p>
* The main difference of this group with the swing one is that you can deselected buttons by clicking on them
* and have a group without no selected button.<br>
* Another difference is that this class extends the java.util.Observable class and calls its observers update method
* when the selected button changes.
* </p>
*/
public class ButtonGroup extends Observable implements Serializable {
private static final long serialVersionUID = 1L;
/**
* The buttons list
*/
private List<JToggleButton> buttons;
/**
* The current selection.
*/
private JToggleButton selected;
private ItemListener listener;
/**
* Constructor.
*/
public ButtonGroup() {
this.buttons = new ArrayList<JToggleButton>();
this.selected = null;
this.listener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
JToggleButton b = (JToggleButton) e.getItem();
if (e.getStateChange()==ItemEvent.SELECTED) {
setSelected(b);
} else {
if (selected==b) setSelected(null);
}
}
};
}
/**
* Adds a button to this group.
* @param b the button to be added
* @exception NullPointerException if the button is null
*/
public void add(JToggleButton b) {
if (b==null) throw new NullPointerException();
buttons.add(b);
b.addItemListener(listener);
if (b.isSelected()) setSelected(b);
}
/**
* Removes a button from this group.
* @param b the button to be removed
* @exception IllegalArgumentException if the button is unknown in this group
* @exception NullPointerException if the button is null
*/
public void remove(JToggleButton b) {
if (b == null) throw new NullPointerException();
if (this.buttons.remove(b)) {
b.removeItemListener(this.listener);
if (this.selected==b) setSelected(null);
} else {
throw new IllegalArgumentException();
}
}
/**
* Clears the selection such that none of the buttons in the
* <code>ButtonGroup</code> are selected.
*/
public void clearSelection() {
if (selected != null) setSelected(null);
}
/**
* Returns the selected button.
* @return the selected button
*/
public JToggleButton getSelected() {
return this.selected;
}
/** Changes the selected button.
* @param b the button to be selected (null deselects all buttons)
* @exception IllegalArgumentException if the button is not in this group
*/
public void setSelected(JToggleButton b) {
if (b==this.selected) return;
if ((b!=null) && (!this.buttons.contains(b))) throw new IllegalArgumentException();
JToggleButton old = this.selected;
this.selected = b;
if (b!=null) b.setSelected(true);
if (old!=null) old.setSelected(false);
this.setChanged();
this.notifyObservers(this.selected);
}
}