访问每个动态添加的jComponent

时间:2015-05-11 19:20:52

标签: java swing

在我提出问题之前,可以使用此answer for my question动态添加jTextFieldsjComboBoxes来获取价值。

现在我的subPanel我有3 jComboBoxes和4 jTextFields

要获取jComponent的值,我正在使用此代码:

Component[] children = jPanel1.getComponents();
// iterate over all subPanels...
for (Component sp : children) {
    if (sp instanceof subPanel) {
        Component[] spChildren = ((subPanel)sp).getComponents();
        // now iterate over all JTextFields...
        for (Component spChild : spChildren) {
            if (spChild instanceof JTextField) {
                String text = ((JTextField)spChild).getText();
                System.out.println(text);
            }
        }
    }
}

我想问一下,是否可以分别访问每个jComboBoxesjTextFields,即我可以操纵每个jComponent并设置不同的值吗?我怎样才能做到这一点?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

  

我想问一下是否可以分别访问每个jComboBoxes和jTextFields,即我可以操作每个jComponent并设置不同的值吗?我怎样才能做到这一点?

您可以保留对组件的引用,而不是遍历组件层次结构(对布局更改很脆弱)。以下示例是一个包含Child组件的实例变量的类:

public class ComponentWrapper extends JComponent{

    private JComboBox combo;
    private JTextArea textArea;

    public ComponentWrapper(){
        combo = new JComboBox();
        textArea = new JTextArea();
        add(combo);
        add(textArea);
    }

    public Text getTextArea(){
        return textArea;
    }

    public JComboBox getComboBox(){
        return comboBox;
    }
}

上面的类扩展了JComponent,在构造函数中添加了组件,并且可以在其他地方添加到另一个Container。 请注意,上述类只是如何执行此操作的示例,可能需要根据您的要求进一步调整。用法:

ComponentWrapper wrapper = new ComponentWrapper ();
add(wrapper);
revalidate();//if adding 'dynamically'

//later, when you want to get the text
String text = wrapper.getTextArea().getText();

答案 1 :(得分:0)

由于这两个类(JComboBoxJTextField)都延伸JComponent,您可以创建ArrayList并将其添加到其中。即。

ArrayList<JComponent> components = new ArrayList<JComponent>();
JComboBox pie = new JComboBox();
components.add(pie)
//pie is now stored in components as a JComponent

当您需要引用pie时,您可以致电:

JComboBox pie = (JComboBox) components.get(0);

这可以通过任何JComponent来完成,并且只需将其投射到它上面即可引用它。然而,这种方法可能会导致一些混淆。因此,您应该记住添加它们的顺序,或者以非常特定的方式添加它们(例如,首先是TextFields,然后是ComboBoxes)。