从动态添加的 jPanel 中获取文本
Posted
技术标签:
【中文标题】从动态添加的 jPanel 中获取文本【英文标题】:get text from dynamically added jPanel 【发布时间】:2015-06-27 06:00:54 【问题描述】:我将subPanel
动态添加到jPanel1
(使用jTextField
和jButton
)。部分代码是从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(或addPanel
s)被添加到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()?