从动态添加的 jPanel 中获取文本

Posted

技术标签:

【中文标题】从动态添加的 jPanel 中获取文本【英文标题】:get text from dynamically added jPanel 【发布时间】:2015-06-27 06:00:54 【问题描述】:

我将subPanel 动态添加到jPanel1(使用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);

您的回复将不胜感激。

【问题讨论】:

您在 addActionPerformed 中创建了新的 JPanel,对吗?您是否尝试过将新的 JPanel 作为变量保留在 Main 类的上下文中并直接访问其成员? @Oliver Schmidt:是的,我在 addActionPerformed 中创建了新的 JPanel,当我将新的 JPanel 声明为无法动态添加 jPanel 的变量时,我尝试了您的建议。 首先,在您的代码示例中从未调用方法void addPanel()。不过,这应该是向jXTaskPane1 添加控件的方法,对吧?其次,内部类private class addPanel 没有为它扩展的JPanel 类增加更多的价值。相反,它让读者感到困惑:-) 第三,当我执行代码时,empty JPanels(或addPanels)被添加到jXTaskPane1。当然,您无法访问空 JPanel 上的任何控件,因为没有什么可访问的! :-) 您能否重写示例,使其符合您在问题中指出的内容? @Oliver Schmidt 我编辑了我的问题。 【参考方案1】:

问题是:你正在迭代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);
            
        
    

【讨论】:

您的方法效果很好,但出现了一些问题。我想问一下我可以单独访问每个JTextFields吗? 是的,在最里面的循环中,您已经可以访问它们中的每一个。 但如果 subPanel 包含 3 个 comboBoxes 我不能单独操作它们,例如对于 jcb1:jcb1.getSelectedItem().toString().substring(1, 2),对于 jcb2:jcb2.getSelectedItem().toString().substring(1, 7),...我总是为 3 个 comboBoxes 获取 substring(1, 2)。是否可以单独操作每个? 嗯,这听起来不像是好的设计...要回答您的问题,您必须识别循环当前正在迭代哪个面板。也许通过spChild.getName()【参考方案2】:

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

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

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

【讨论】:

以上是关于从动态添加的 jPanel 中获取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在已动态添加的JLabel的JPanel中getLocation()?

如何将 JLabels 动态添加到 JPanel?

在 JPanel 中获取组件的值

动态创建 jCheckBox 并添加到 jScrollPane

使用JPanel绘图使JScrollPanel动态调整大小

从动态添加的表行中获取数据