从动态添加的jPanel获取文本

时间:2015-04-20 13:21:43

标签: java swing io netbeans-8

我正在动态subPanel添加到jPanel1jTextFieldjButton)。部分代码是从there借来的。

我正在尝试从jPanel1的组件中获取文本,但无法成功。

编辑: 这是一个包含jTextField+Button-Button的子面板。

private class subPanel extends javax.swing.JPanel {         
        subPanel me;
        public subPanel() {
            super();
            me = this;
            JTextField myLabel = new JTextField(15);
            add(myLabel);
            JButton myButtonRemove = new JButton("-");
            JButton myButtonAdd = new JButton("+");
            add(myButtonRemove);
            add(myButtonAdd);

这是AddButton的代码:

    jPanel1.add(new subPanel());
    pack();

我尝试从jTextField获取文字的code无效:

     Component[] children = jPanel1.getComponents();
     for (int i=0;i<children.length;i++){
     if (children[i] instanceof JTextField){
     String text = ((JTextField)children[i]).getText();
     System.out.println(text);

}

非常感谢您的回复。

2 个答案:

答案 0 :(得分:0)

问题是:您正在迭代jPanel1的孩子:

jPanel1.getComponents();

期待有JTextField

if (children[i] instanceof JTextField){
     String text = ((JTextField)children[i]).getText();
     System.out.println(text);
}

但是,由于您已将subPanels添加到jPanel1,因此jPanel1的子项为subPanels,而不是JTextFields

因此,为了访问JTextFields,您必须在一秒subPanels内迭代for-loop的孩子!

示例:

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

答案 1 :(得分:0)

我知道这个问题有点老了,但仍然可以帮助更多的未来观众。 我最初的回应是在@Oliver Schmidt中将其写为评论,但是由于我还没有50声望,所以决定在一个单独的答案中写这个。

要访问动态添加的jPanel "subPanel"中包含的组件,您不一定需要使用第二个for循环,您可以使用以下行直接访问subPanel的组件代码,例如

字符串s1 = (((subPanel)sp) .jcb1.getSelectedItem()。toString()。substring(1、2); ...

所以总体代码如下,

String s1;
String s2;
String s3;
String text;
Component[] c = jPanel1.getComponents();

for (Component sp : c) {
    if (sp instanceof subPanel) {

        //access the component from properly type converted subPanel
        s1 = ((subPanel) sp).jcb1.getSelectedItem().toString().substring(1, 2);
        s2 = ((subPanel) sp).jcb2.getSelectedItem().toString().substring(1, 2);
        s3 = ((subPanel) sp).jcb3.getSelectedItem().toString().substring(1, 2);
        text = ((subPanel) sp).myLabel.getText();
    }
}

System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(text);