通过Function清除所有JTextField

时间:2015-01-14 06:28:19

标签: java swing clear

我需要一个static method我可以保留在任何public class中,我会在其中传递JInternalFrame的对象,它会自动清除特定JInternalFrame ..

的所有TextFields(使用循环)

我已经经历了很多答案,但是他们只是单独使用setText("")来表示所有TextFields,但那并不高效,因为在我的项目中我计划50个表单和超过500个TextFields .. < / p>

如果有人向我提供了有评论的片段,那么我将能够理解其他组件的工作和实现,例如我自己的复选框,收音机等,将会很有帮助

3 个答案:

答案 0 :(得分:2)

简而言之。

具有静态功能的类:

public class JCTest
{
    public static void Clear(JInternalFrame intFrame)
    {
        if (intFrame == null)
            return;
        Container con = intFrame.getContentPane();
        for (Component c : con.getComponents())
        {
            if (c instanceof JTextField)
            {
                JTextField j = (JTextField)c;
                j.setText("");
            }
        }
    }
}

调用它:

public class Main
{
    public static void main(String[] args)
    {
        JInternalFrame intFrame = new JInternalFrame();
        JCTest.Clear(intFrame);
    }
}

答案 1 :(得分:1)

基本上你可以调用getComponents()方法来返回所有子组件。然后你必须检查它是否是JTextField类型,然后你可以调用.setText(“”)。如果你想要一个适用于所有Swing组件的simmilar解决方案,你可以使用Document,它是组件显示的数据的抽象。这是一个例子:

if (rootComponent instanceof Container) {
    Component[] subComponents = ((Container) rootComponent).getComponents();
        for (Component c : subComponents) {
            if (c instanceof JTextField)
                c.setText("");
        }
    } 

编辑这是来自我的项目,我已经将它拆分为两种方法。 ApplyColors,因为我用它来为组件着色。我认为它也适用于setText()。

public static void applyColors(Window parent) {
    List<String> colorComponentsClassNames = Arrays.asList("JTextField");
        for (Component component : getAllComponents(parent)) {
        Component[] components = ((Container) component).getComponents();
        for (int i = 0; i < components.length; i++) {
            Component currentComponent = components[i];
            if (!colorComponentsClassNames.contains(currentComponent.getClass().getSimpleName())) {
                continue;
            }
            currentComponent.setText(""));

        }
    }
}

public static List<Component> getAllComponents(final Container c) {
    Component[] comps = c.getComponents();
    List<Component> compList = new ArrayList<Component>();
    for (Component comp : comps) {
        compList.add(comp);
        if (comp instanceof Container) {
            compList.addAll(getAllComponents((Container) comp));
        }
    }
    return compList;
}

答案 2 :(得分:1)

你可以......

使用Container#getComponents列出给定Container的所有子组件,您需要检查每个Component并测试它是否为instanceof {{ 1}},当您找到一个组件时,将其强制转换并使用JTextField清除该字段。您还需要测试每个setText以查看它是否为Component instanceof并执行递归搜索,因为Container将仅返回指定{的直接子项{1}}

这有点麻烦且耗时,因为您需要遍历整个组件层次结构以确保找到所有字段。这也意味着它会清除您实际上不想清除的字段......

你可以......

创建一个自定义类,从getComponents或其他类Container扩展而来,它有一个名为JInternalFrame的方法(例如),它可以简单地循环遍历{{1 } JPanel s。

您需要将此方法管理的每个字段添加到clearFields,但这将是一种更简单的机制......

List

然后,您的所有表单都需要从此扩展,如果需要,您只需为给定表单调用JTextField即可...