循环通过JPanel

时间:2009-06-24 08:42:41

标签: java swing loops jpanel jtextfield

为了在用户点击“清除按钮”时初始化JTextfField上的所有JPanel,我需要遍历JPanel(而不是将所有单个字段设置为“ “)。

如何使用for-each循环来遍历JPanel以搜索JTextField s?

2 个答案:

答案 0 :(得分:16)

for (Component c : pane.getComponents()) {
    if (c instanceof JTextField) { 
       ((JTextField)c).setText("");
    }
}

但是如果你有更深层次嵌套的JTextFields,你可以使用以下递归形式:

void clearTextFields(Container container) {
    for (Component c : container.getComponents()) {
        if (c instanceof JTextField) {
           ((JTextField)c).setText("");
        } else
        if (c instanceof Container) {
           clearTextFields((Container)c);
        }
    }
}

修改 Tom Hawtin - 标题建议的示例是在您的框架类中包含列表:

List<JTextField> fieldsToClear = new LinkedList<JTextField>();

并在初始化单个文本字段时,将它们添加到此列表中:

someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }

当用户点击清除按钮时,只需:

for (JTextField tf : fieldsToClear) {
    tf.setText("");
}

答案 1 :(得分:1)

虽然另一个答案显示了解决问题的直接方法,但您的问题意味着解决方案很糟糕。

通常希望层之间的静态依赖关系是一种方式。你需要通过getCommponents打包。施法(假设是泛型)是一种容易看出出错的方法。

因此,当您为表单创建文本字段时,将它们添加到要清除的列表中,并将其添加到面板中。当然,在实际代码中,您可能还需要对其进行其他操作。在实际代码中,您可能希望处理模型(可能是Document)而不是JComponent