从动态添加的 jPanel 获取文本

get text from dynamically added jPanel

我正在动态添加 subPaneljPanel1(使用 jTextFieldjButton)。部分代码是从 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);

}

非常感谢您的回复。

问题是:您正在迭代 jPanel1 的 children:

jPanel1.getComponents();

并希望有 JTextField:

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

但是因为你在jPanel1中添加了subPanels,所以jPanel1的children是subPanels,而不是JTextFields!

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

示例:

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

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

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

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