5

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

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

4

2 回答 2

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("");
}
于 2009-06-24T08:45:42.503 回答
1

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

通常希望层之间的静态依赖是一种方式。你应该需要通过一个包getCommponents。强制转换(假设泛型)是一种简单的方法来查看出现问题的地方。

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

于 2009-06-24T11:06:01.767 回答