从动态添加的 jPanel 获取文本
get text from dynamically added jPanel
我正在动态添加 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);
}
非常感谢您的回复。
问题是:您正在迭代 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);
我正在动态添加 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);
}
非常感谢您的回复。
问题是:您正在迭代 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);