Java获取JPanel组件

Dev*_*ted 14 java swing jcomponent jpanel jframe

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

for (int i=0; i<maxPoints; i++) {
    JTextField textField = new JTextField();
    points.add(textField);
}
Run Code Online (Sandbox Code Playgroud)

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

TextField.getText();
Run Code Online (Sandbox Code Playgroud)

谢谢

Osc*_*Ryz 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.
}
Run Code Online (Sandbox Code Playgroud)

//稍后

for( JTextField f : list ) { 
   System.out.println( f.getText() ) ;
}
Run Code Online (Sandbox Code Playgroud)

那不容易吗?

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

假设你想获得一系列文本,而不是

 public List<JTextField> getFields();
Run Code Online (Sandbox Code Playgroud)

你应该考虑:

 public List<String> getTexts(); // get them from the textfields ... 
Run Code Online (Sandbox Code Playgroud)


Uri*_*Uri 10

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

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

如果这是一个周期性的任务或者可以从多个点完成,那么有一个特殊的类代表一个带有文本字段的面板甚至可能是有意义的,然后通过它的接口提供访问这些字段的方法.


小智 6

您应该调用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)