18

我有一个充满 JTextFields 的 JPanel ......

for (int i=0; i<maxPoints; i++) {
    JTextField textField = new JTextField();
    points.add(textField);
}

我以后如何在该 JPanel 中获取 JTextFields?就像我想要他们的价值观一样

TextField.getText();

谢谢

4

7 回答 7

12

Java 中的每个 JPanel 也是一个 AWT 容器。因此,您应该能够使用 getComponents 来获取面板中包含的组件数组,对其进行迭代,检查它们的类型(以确保您没有获得其他控件),并对它们进行任何您需要的操作。

然而,这通常是糟糕的设计。如果您知道您将需要访问特定组件,最好维护这些文本字段的数组并将其传递,即使它们在视觉上包含在容器中。

如果这是一个经常性的任务或者可以从多个点完成,甚至可以有一个特殊的类来表示一个带有文本字段的面板,然后通过它的接口提供访问这些字段的方法。

于 2008-12-16T02:30:56.747 回答
11

请记住,他们自己并没有到达那里(我想阅读一些关于在运行时动态创建这些面板的问题)

在那张贴的答案中,有人说您应该在数组中保留对这些文本字段的引用。这正是您在这里需要的:

List<JTextField> list = new ArrayLists<JTextField>();

// your code...
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField();
    points.add(textField);
    list.add( textField ); // keep a reference to those fields.
}

// 之后

for( JTextField f : list ) { 
   System.out.println( f.getText() ) ;
}

那不是很容易吗?

请记住将这些类型的工件(列表)尽可能保密。它们仅供您控制,我认为它们不属于界面。

假设您想要获取文本数组,而不是

 public List<JTextField> getFields();

你应该考虑:

 public List<String> getTexts(); // get them from the textfields ... 
于 2008-12-16T02:50:50.280 回答
4

这就是我递归遍历容器并获取 JPanel 上的文本字段的方法。

private void ClearAllFields(Container myContainer) {

    Component myComps[] = myContainer.getComponents();

    for (int i=0; i<myComps.length; i++) {
      if(myComps[i] instanceof JPanel) {
          JPanel myPanel = (JPanel) myComps[i];
          ClearAllFields(myPanel);
      }
      if(myComps[i] instanceof JTextField) {
        JTextField myTextField = (JTextField) myComps[i];
        myTextField.setText("");
      }
    }        
}

然后使用它,你这样称呼它

ClearAllFields([jdialog or jframe etc].getContentPane());
于 2017-10-11T17:32:26.043 回答
3

您应该调用 getComponents 方法,该方法返回 JPanel 上所有元素的数组。在您可以迭代数组并检查它是否与寻求的组件相等之后。

List<JTextField> list = new ArrayLists<JTextField>();
Component[] components = panel.getComponents();

for (Component component : components) {
    if (component.getClass().equals(JTextField.class)) {
        list.add((JTextField)component);
    }
}
于 2015-11-20T12:12:02.130 回答
2
    //una forma de recorer todos los elementos dentro de un jpanel
    Component[] components = jPanelX.getComponents();

    for (int i = 0; i < components.length; i++) {

        if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){
            components[i].setEnabled(false);
        }
    }
于 2013-04-13T16:53:44.170 回答
2

在创建过程中动态地为其命名,然后执行此操作。

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }
于 2019-01-05T11:32:43.190 回答
0

您的问题是编写繁琐的代码文本。为什么不直接生成并粘贴到程序中!!...

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("JTextField tf"+i+" = new JTextField()"+";");
   System.out.println("points.add(tf"+i+")"+";");
}

将上述代码的输出粘贴到您的程序中,您就完成了。现在,要访问文本字段的内容,您可以以类似的方式生成繁琐的代码文本......

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
于 2017-06-25T14:08:47.420 回答