【发布时间】:2010-11-05 10:43:37
【问题描述】:
为了在用户单击“清除按钮”时在JPanel 上初始化所有JTextfFields,我需要循环遍历JPanel(而不是将所有单个字段设置为“”)。
如何使用 for-each 循环遍历 JPanel 以搜索 JTextFields?
【问题讨论】:
标签: java swing loops jpanel jtextfield
为了在用户单击“清除按钮”时在JPanel 上初始化所有JTextfFields,我需要循环遍历JPanel(而不是将所有单个字段设置为“”)。
如何使用 for-each 循环遍历 JPanel 以搜索 JTextFields?
【问题讨论】:
标签: java swing loops jpanel jtextfield
for (Component c : pane.getComponents()) {
if (c instanceof JTextField) {
((JTextField)c).setText("");
}
}
但如果您的 JTextField 嵌套更深,您可以使用以下递归形式:
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 - tackline 建议的示例是在您的框架类中包含列表:
List<JTextField> fieldsToClear = new LinkedList<JTextField>();
当您初始化各个文本字段时,将它们添加到此列表中:
someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }
当用户点击清除按钮时,只需:
for (JTextField tf : fieldsToClear) {
tf.setText("");
}
【讨论】:
虽然另一个答案显示了解决您问题的直接方法,但您的问题暗示了一个糟糕的解决方案。
通常希望层之间的静态依赖是一种方式。您应该需要通过getCommponents 打包。强制转换(假设是泛型)是一种简单的方法来查看是否有问题。
因此,当您为表单创建文本字段时,请将它们添加到要在清除操作中清除的列表中,以及将它们添加到面板中。当然,在实际代码中,您可能还想对它们做其他事情。在实际代码中,您可能希望处理模型(可能是 Document)而不是 JComponents。
【讨论】: