2

我有三个 JCheckBox,如下所示:

final JCheckBox c1 = new JCheckBox("A");
final JCheckBox c2 = new JCheckBox("B");
final JCheckBox c3 = new JCheckBox("C");

我通过 ButtonGroup 为这个复选框创建了一个组,如下所示:

final ButtonGroup bg = new ButtonGroup();
bg.add(c1);
bg.add(c2);
bg.add(c3);

我有一个按钮来将选定的项目显示到如下标签中:

String SelectedItem=""; 
Enumeration<AbstractButton> items= bg.getElements();
while (items.hasMoreElements()) {
    AbstractButton btn = items.nextElement();
if(btn.isSelected())
{
        SelectedItem+=btn.getText()+",";
    }
 }
 lblA.setText(SelectedItem);

这工作正常,但我不能在运行时选择多个复选框。

4

2 回答 2

10

的目的ButtonGroup是多排他选择。不要ButtonGroup仅在您希望拥有按钮集合时才创建。而不是ButtonGroup使用像ArrayList.

List<JCheckBox> buttons = new ArrayList<>();
buttons.add(c1);
buttons.add(c2);
buttons.add(c3);

...

for ( JCheckbox checkbox : buttons ) {
    if( checkbox.isSelected() )
    {
        SelectedItem += btn.getText() + ",";
    }
}

进一步注意:.setText在 Swing 事件线程 ( invokelater) 中进行更新 ( ),请记住,最好在这种串联中创建 StringBuilder,但是对于这样的 UI 组件数量,性能影响可能不会很明显。

于 2013-10-08T11:23:07.633 回答
3

从文档:

类按钮组

此类用于为一组按钮创建多重排除范围。使用相同的 ButtonGroup 对象创建一组按钮 意味着“打开”其中一个按钮会关闭组中的所有其他按钮。

也就是说,您可能正在使用错误的类来执行您需要的操作,如果您想对这些复选框进行分组,将它们放在面板中,那么您可以使用面板而不是每个复选框来处理可见性、位置和所有其他属性。

这是文档的链接:链接

于 2013-10-08T11:27:21.460 回答