循环通过JPanel

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

我怎样才能使用for-each循环来遍历JPanel来搜索JTextField

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

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

 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 fieldsToClear = new LinkedList(); 

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

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

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

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

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

通常希望层之间的静态依赖关系是一种方式。 您应该通过getCommponents进行getCommponents 。 施法(假设是generics)是一种容易看出出错的方法。

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