【问题标题】:Iterate through all checkboxes in Swing遍历 Swing 中的所有复选框
【发布时间】:2016-12-10 00:52:42
【问题描述】:

我正在使用 java 和 swing 开发一个小型应用程序,但我面临的问题可能会让我从头开始做其中的一部分。

在其中一个面板中,我有大约 20 个复选框。到目前为止,变量名称是 jcheckbox1、jcheckbox2 等。我需要遍历所有变量并检索所选变量的文本。问题在于我使用 NetBeans 来开发我的 GUI,方法是根据需要拖放元素,因此我没有将复选框聚合在列表或数组中。鉴于此,是否有可能选择所有复选框并遍历它们以检索已检查的文本值?

如果没有,我应该如何以一种可以轻松遍历它们的方式声明它们?我相信一系列复选框本身可能并不难做到,但问题似乎来自于将它们全部放置在正确的位置。如果有帮助,我正在使用带有两列的 gridbag。

谢谢!

【问题讨论】:

  • I have used NetBeans to develop my GUI by dragging and dropping the elements as I needed them - 不要使用 IDE 创建表单。正如您所看到的,这是这个问题的一个问题,而且如果您需要移动到不同的 IDE,代码也是不可移植的。而是自己编写表单并使用适当的布局管理器来获得所需的布局。代码将更容易维护和使用。例如从How to Use GridLayout的演示代码开始。

标签: java swing checkbox


【解决方案1】:

给定一个Container,你可以找到所有的子组件,然后检查它们是否是JCheckBox,然后检查它们是否被检查。

以下示例方法的灵感来自How to get all elements inside a JFrame?,并根据您的需要进行了调整:

public static List<String> manageCheckedCheckboxes(final Container c) {
    Component[] comps = c.getComponents();
    List<String> checkedTexts = new ArrayList<String>();

    for (Component comp : comps) {

        if (comp instanceof JCheckBox) {
            JCheckBox box = (JCheckBox) comp;
            if (box.isSelected()) {

                String text = box.getText();
                checkedTexts.add(text);
            }
        }
    }

    return checkedTexts;

}

【讨论】:

  • 请注意,@flakes 的回答也是正确的,如果您使用的是 Java 8。
【解决方案2】:

您可以遍历容器中的组件并查看它们是否可以转换为复选框。

List<JCheckBox> checkboxes = Arrays.stream(container.getComponents())
    .filter(c -> c instanceof JCheckBox)
    .map(JCheckBox.class::cast)
    .collect(Collectors.toList());

List<String> selectedText = checkboxes.stream()
    .filter(JCheckBox::isSelected)
    .collect(Collectors.toList());

为了好玩,我制作了一个通用递归版本来查找您可能需要的任何组件:

public static <T extends JComponent> List<T> findComponents(
    final Container container,
    final Class<T> componentType
) {
    return Stream.concat(
        Arrays.stream(container.getComponents())
            .filter(componentType::isInstance)
            .map(componentType::cast),
        Arrays.stream(container.getComponents())
            .filter(Container.class::isInstance)
            .map(Container.class::cast)
            .flatMap(c -> findComponents(c, componentType).stream())
    ).collect(Collectors.toList());
}

【讨论】:

    【解决方案3】:

    Netbeans 为拖放组件生成代码,因此您可以手动将它们添加到列表或其他集合中,然后对其进行迭代。

    【讨论】:

    • 怎么样?添加一些更具示范性的东西
    【解决方案4】:

    Netbeans 仍然允许在表单设计中编写自定义代码,您所要做的就是找到源代码,创建一个复选框数组。

    创建一个数组,在页面底部,可以在其中找到其他变量:

    初始化数组为:

    稍后您可以简单地遍历数组

    for(JCkeckBox cb: ckeckBoxes){
        //
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2010-12-19
      • 1970-01-01
      • 2016-12-31
      • 2022-01-20
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多