循环通过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
。