2010-11-26 27 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> 

當然。