我正在开发一个带有java和swing的小应用程序,我正面临一个问题,可能会让我从头开始做一部分。
在其中一个面板中,我有大约20个复选框。到目前为止,变量名称是jcheckbox1,jcheckbox2等。我需要遍历所有变量并检索所选变量的文本。问题在于我使用NetBeans通过在需要时拖放元素来开发我的GUI,因此我没有在列表或数组中聚合的复选框。鉴于此,是否有可能选择所有复选框并迭代它们以检索所检查的复选框的文本值?
如果没有,我应该如何以可以轻松迭代它们的方式声明它们?我相信一系列复选框本身可能不是很难做到,但麻烦似乎来自将它们全部放在正确的位置。我正在使用带有两列的网格包,如果有帮助的话。
谢谢!
答案 0 :(得分:3)
给定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;
}
答案 1 :(得分:1)
您可以遍历容器中的组件,看看它们是否可以转换为复选框。
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());
}
答案 2 :(得分:0)
Netbeans生成拖动代码删除组件,以便您可以手动将它们添加到列表或其他集合中,然后迭代它。
答案 3 :(得分:0)