2008-12-16 61 views
14

我有一个JPanel全JTextField中的...的Java得到的JPanel组件

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

我怎么后来得到在JPanel中JTextField的?就像如果我想与

TextField.getText(); 

感谢

+0

我不得不说,谢谢“没人”为消除这些苹果标志和“THANKSSS”搁笔。 – 2008-12-16 02:35:03

回答

11

那么记住他们并没有通过他们的自我那里(我想了解有关动态创建这些面板在运行时的一些问题)

在贴有答案,有人说你应该保持参照该等数组中的textfields。这正是你需要的东西在这里:

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 ... 
10

它们的值每的JPanel Java中也是一个AWT容器。因此,您应该可以使用getComponents获取面板中包含的组件的数组,并遍历它们,检查它们的类型(以确保您没有获得其他控件),并根据需要随意使用它们。

但是,这通常是糟糕的设计。如果您知道需要访问特定的组件,最好将这些文本字段的数组保留并传递给它,尽管它们可视化地包含在容器中。

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

1
//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); 
     } 
    } 
+1

是否可以使用其声明的名称获取该组件?我的意思是组件的变量名称 – Barrier 2015-12-02 04:25:05

2

你应该调用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); 
    } 
} 
+0

是否可以使用其声明的名称获取此组件?我的意思是组件的变量名称。 – Barrier 2015-12-02 04:23:14

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()"+";"); 
} 
1

这是我做的递归经过容器和获取是在文本框JPanels。

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