我有一个充满JTextFields的JPanel ......
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField);
}
我如何在以后的JPanel中获取JTextField?就像我想要他们的价值观
TextField.getText();
由于
答案 0 :(得分: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 ...
答案 1 :(得分:10)
Java中的每个JPanel也是一个AWT容器。因此,你应该能够使用getComponents来获取面板中包含的组件数组,迭代它们,检查它们的类型(确保你没有得到其他控件),并用它们做任何你需要的事情。
然而,这通常是糟糕的设计。如果您知道需要访问特定组件,最好维护这些文本字段的数组并将其传递,即使它们在视觉上包含在容器中。
如果这是一个经常性的任务或者可以从多个点完成,那么有一个特殊的类代表一个带有文本字段的面板甚至是有意义的,然后通过它的接口提供访问这些字段的方法。
答案 2 :(得分:3)
您应该使用JPanel上所有元素的数组调用getComponents方法。在您可以迭代数组并检查它是否与搜索到的组件相等时。
List<JTextField> list = new ArrayLists<JTextField>();
Component[] components = panel.getComponents();
for (Component component : components) {
if (component.getClass().equals(JTextField.class)) {
list.add((JTextField)component);
}
}
答案 3 :(得分: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);
}
}
答案 4 :(得分:1)
这就是我通过递归遍历容器并获取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());
答案 5 :(得分:1)
在创建过程中为其动态命名,然后执行此操作。
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")
}
}
}
答案 6 :(得分: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()"+";");
}