2010-11-26 26 views
4

我目前的工作是在系统运行时增加JTextFields将到面板的应用程序:Java - 在运行时添加Swing组件使用引用名称?

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

所以我每次运行作出的文本字段的时间将分别称为ROW1,ROW2,ROW3。

谢谢。

回答

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

后来终于WNE你想获得他们的所有,你可以遍历列表并逐个获取所有文本字段。

for(JTextField field : fields){ 
    dostuff ... 
} 
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(); 
} 
+0

这很好,虽然你不需要调用revalidate()+ validate()。只需重新验证()就足够了。 – 2010-11-26 16:12:21

+1

为什么一个* linked * list?这几乎从来都不是最好的选择。 – 2010-11-26 16:27:02

1

据我所知这是不可能的。另一种(也许更整洁)的方式来做到这一点,当你创建它们像

JTextField label = new JTextField(20); 
fieldList.add(label); 
pnlRows.add(label); 

然后可以使用字段列表来访问你想要的文本字段存储标签:

JTextField label = fieldList.get(row); 

编辑:fieldList是

List<JTextField> 

当然。