Java - 如何在运行时添加Swing组件并指定引用名称?

4

我目前正在开发一个应用程序,使用以下代码在运行时向面板添加JTextFields:

int rowCounter = 1;             
pnlRows.add(new JLabel("Row " + rowCounter));
pnlRows.add(new JTextField(20));
pnlRows.revalidate();
validate();

我的问题是我想在方法中使用它们的值,但无法引用它们。

有没有一种类似于这样的方法:

int i = 1;
JTextField row + i = new JTextField();
i++;

所以每次运行时,生成的TextField将分别被称为row1、row2和row3。
谢谢。
3个回答

2
public List<JTextField> rows = new Linkedlist<JTextField>();

addRow() {
    JTextField field = new JTextField(20);
    rows.add(field);
    pnlRows.add(new JLabel("Row " + rows.size()));
    pnlRows.add(field);
    pnlRows.revalidate();
    validate();
}

这很好,虽然你不需要调用revalidate() + validate()。仅调用revalidate()就足够了。 - Steve McLeod
1
为什么要使用链表?它几乎从来不是最好的选择。 - Michael Borgwardt

1
据我所知,这是不可能的。另一种(也许更好的)方法是在创建标签时存储它们,例如:
JTextField label = new JTextField(20);
fieldList.add(label);
pnlRows.add(label);

然后,您可以使用fieldList访问所需的文本字段:

JTextField label = fieldList.get(row);

编辑:fieldList 是一个

List<JTextField>

当然。


1

没有,你需要做的是将它们添加到列表中,以便稍后可以获取所有内容。

在你的类中的某个地方,你需要这样做:

List<JTextField> fields = new ArrayList<JTextField>();

然后当他们添加它们时,您可以这样做:

int rowCounter = fields.size()+1;             
pnlRows.add(new JLabel("Row " + rowCounter));
JTextField field = new JTextField(20);
pnlRows.add(field);
fields.add(field);
pnlRows.revalidate();
validate();

最后,当你想要获取它们所有时,你可以迭代列表并逐个获取所有文本字段。
for(JTextField field : fields){
    dostuff ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接