通过函数清除所有 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
的方法(例如) ,它可以简单地循环遍历 JTextField
的 List
。
您需要将要通过此方法管理的每个字段添加到 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);
}
}
我需要一个 static
method
,我可以将其保留在任何 public
class
中,我将在其中传递 JInternalFrame
的对象和它将自动清除特定 JInternalFrame
..
我已经回答了很多问题,但他们只是简单地说明了对所有 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
的方法(例如) ,它可以简单地循环遍历 JTextField
的 List
。
您需要将要通过此方法管理的每个字段添加到 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);
}
}