【问题标题】:loop through JPanel循环通过JPanel
【发布时间】:2010-11-05 10:43:37
【问题描述】:

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

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

【问题讨论】:

    标签: java swing loops jpanel jtextfield


    【解决方案1】:
    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("");
    }
    

    【讨论】:

    • 这也能清除组合框吗? (顺便说一句,也可能是静态的。)
    • JComboBox(扩展 JComponent)和 JTextField(扩展 JTextComponent,扩展 JComponent)位于两条不同的路径上
    • 我检查了 JComboBox 的来源,我没有看到 JComboBox 将其编辑器组件添加到其组件列表的任何地方。
    • 非常感谢 kd304,它很有效。只需要添加 import java.awt.*;导入 javax.swing.*;导入 java.awt.Component;
    • 是的,对不起。我太习惯于 Eclipse 中的 CTRL+SHIFT+O 来组织我的导入。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您好,非常感谢。这听起来令人印象深刻,但我不知道如何实施您的解决方案。具体的例子值一千字。非常感谢。达拉格。
    • 为了进一步推动它,我曾经尝试过一个基于注释的解决方案来获得乐趣。我用 @SaveContent 注释了类中的字段,并使用反射方法加载/保存注释组件的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多