如何取消选择JFrame中的单选按钮
我想取消选中我的JFrame程序中的单选按钮,它存在一些方法可以通过一个名为Clean的按钮取消选择所有单选按钮?此按钮将清理放射按钮和文本。如何取消选择JFrame中的单选按钮
行动码来进行,这将使清洁所有认为:
JButton btnClean = new JButton("Clean");
btnClean.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
btnClean.setBounds(208, 184, 126, 28);
contentPane.add(btnClean);
通常JradioButton将在ButtonGroup的对象,逻辑对象,只允许一个一个JRadioButton组合在一起,在一个时间来选择。你想要做的就是在这个ButtonGroup对象上调用clearSelection()
。
顺便说一句,你看起来在你的GUI上使用null
布局。虽然Swing的新手可能看起来像是创建复杂GUI的最简单也是最好的方式,但更多Swing GUI的创建使用它们时会遇到更严重的困难。它们不会在GUI大小调整时调整组件的大小,它们是增强或维护的皇室女巫,当它们放在滚动窗格中时它们会完全失败,在所有平台或屏幕分辨率与原始视图不同时,它们看起来会非常糟糕。
例如
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class BunchOButtons extends JPanel {
private static final String[] RADIO_TEXTS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
private ButtonGroup weekDayBtnGroup = new ButtonGroup();
public BunchOButtons() {
// JRadioButtons love being held in JPanels that use GridLayout
JPanel radioPanel = new JPanel(new GridLayout(1, 0));
radioPanel.setBorder(BorderFactory.createTitledBorder("Week Days"));
for (String radioText : RADIO_TEXTS) {
JRadioButton radioButton = new JRadioButton(radioText); // create radiobtn
radioButton.setActionCommand(radioText); // set its action command text
weekDayBtnGroup.add(radioButton); // add to ButtonGroup
radioPanel.add(radioButton); // add to a GridLayout-using JPanel
}
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new AbstractAction("Show Selection") {
@Override
public void actionPerformed(ActionEvent evt) {
ButtonModel model = weekDayBtnGroup.getSelection();
if (model != null) {
// if something is selected
System.out.println(model.getActionCommand());
} else {
System.out.println("No weekday selected");
}
}
}));
buttonPanel.add(new JButton(new AbstractAction("Clear Selection") {
@Override
public void actionPerformed(ActionEvent e) {
weekDayBtnGroup.clearSelection();
}
}));
setLayout(new BorderLayout());
add(radioPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private static void createAndShowGui() {
BunchOButtons mainPanel = new BunchOButtons();
JFrame frame = new JFrame("BunchOButtons");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
当你的JFrame
可能包含许多JRadioButton
成分任意嵌套在框架的布局,您可能需要使用Container.getComponents
递归下降组件层次结构,并检查各组件是一个instanceof JRadioButton
,在哪种情况下你应该投下并且.setSelected(false)
它或者Container
,在这种情况下你应该继续递归。要获得JFrame
的顶级容器,请使用JFrame.getContentPane
。
为了说明一个简单的例子这种方法(包含由OP要求Clean
方法的实现):
public class FrameWithRadios extends JFrame {
public FrameWithRadios() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panelCenter = new JPanel();
panelCenter.setLayout(new GridLayout(1, 2));
JRadioButton rb11 = new JRadioButton("Option 1.1");
JRadioButton rb12 = new JRadioButton("Option 1.2");
JRadioButton rb13 = new JRadioButton("Option 1.3");
JPanel panelLeft = new JPanel();
panelLeft.setLayout(new GridLayout(3, 1));
panelLeft.add(rb11);
panelLeft.add(rb12);
panelLeft.add(rb13);
panelCenter.add(panelLeft);
JRadioButton rb21 = new JRadioButton("Option 2.1");
JRadioButton rb22 = new JRadioButton("Option 2.2");
JRadioButton rb23 = new JRadioButton("Option 2.3");
JPanel panelRight = new JPanel();
panelRight.setLayout(new GridLayout(3, 1));
panelRight.add(rb21);
panelRight.add(rb22);
panelRight.add(rb23);
panelCenter.add(panelRight);
JButton bClean = new JButton("Clean");
bClean.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clean(getContentPane());
}
});
JPanel panelBottom = new JPanel();
panelBottom.add(bClean);
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(panelCenter, BorderLayout.CENTER);
cp.add(panelBottom, BorderLayout.SOUTH);
}
protected void clean(Component comp) {
if (comp instanceof JRadioButton) {
((JRadioButton) comp).setSelected(false);
}
else if (comp instanceof Container) {
for (Component child: ((Container) comp).getComponents()) {
clean(child);
};
}
}
public static void main(String[] args) {
FrameWithRadios frame = new FrameWithRadios();
frame.setSize(320, 200);
frame.setVisible(true);
}
}
当然,正如其他人的建议,你很可能会想到将单选按钮的选择状态管理分配到ButtonGroup
,并使用ButtonGroup.clearSelection
方法取消选择所有内容(上述内容对于ButtonGroup
中的单选按钮不起作用)。
BurpttinGroup不是组件或容器,不会添加到UI中。相反,它管理着一组按钮 – MadProgrammer
我的不好。我的意思是说,检查每个组件是否是'JRadioButton',并用'.setSelected(false)'取消选择它。 – madanasta
但是,只有当'JRadioButton'组件不在任何'ButtonGroup'中时,这才起作用。 – madanasta
我没有在Components中找到ButtonGroup对象,他可以找到他? PS:我是JFrame的新手,我正在编程,但我们在JOptionPane中只使用Java。 –
@Novatec javax.swingx.ButtonGroup – MadProgrammer
@Novatec:作为疯狂的国家 - 查看ButtonGroup的API。还有一个关于'Java ButtonGroup Tutorial'的Google首先命中:[The ButtonGroup Tutorial](https://docs.oracle.com/javase/tutorial/uiswing/components/buttongroup.html)。也看看上面的代码示例。 –