通过函数清除所有 JTextFields

Clearing all JTextFields through Function

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

的所有 TextFields(使用循环)

我已经回答了很多问题,但他们只是简单地说明了对所有 TextFields 单独使用 setText(""),但这并不高效,因为在我的项目中我计划使用 50 个表单和 500 多个 TextFields。 .

如果有人向我提供也有评论的片段,那将会很有帮助,这样我就可以自己理解其他组件(如复选框、收音机等)的工作和实现

基本上您可以调用 getComponents() 方法,该方法将 return 所有子组件。然后你必须检查它是否是 JTextField 类型,然后你可以在它上面调用 .setText("") 。如果您想要一个适用于所有 Swing 组件的类似解决方案,您可以使用 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;
}

你可以...

使用 Container#getComponents 列出给定 Container 的所有子组件,您需要检查每个 Component 并测试它是否是 instanceof JTextField,当你找到一个组件时,将其投射并使用setText清除该字段。您还需要测试每个 Component 以查看它是否是 instanceof Container 并执行递归搜索,因为 getComponents 只会 return 直接子级指定的 Container

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

你可以...

创建一个自定义 class,从 JInternalFrame 或其他 class 扩展而来,例如 JPanel,它有一个名为 clearFields 的方法(例如) ,它可以简单地循环遍历 JTextFieldList

您需要将要通过此方法管理的每个字段添加到 List,但它会是一个更简单的机制...

public class MyAwesomeForm extends JPanel {
    private List<JTextField> fields;
    
    public void registerField(JTextField field) {
        fields.add(field);
    }

    public void unregisterField(JTextField field) {
        fields.remove(field);
    }

    public void clearFields() {
        for (JTextField field : fields) {
            field.setText(null);
        }
    }
}

然后您的所有表单都需要从这里扩展,并且在需要时,您只需为给定表单调用 clearFields...

保持简短。

Class 静态函数:

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);
    }
}