2016-08-14 120 views
0

我有10個名爲label1,label2,label3,...,label10的JLabel。我想使用for循環設置標籤中的文本。所以我想要做的就像下面這樣:如何在for循環中設置JLabel的屬性?

顯然這是行不通的。

for(int i=1; i<=10; i++){ 
    label+i.setText("label"+i); 
} 

有沒有什麼辦法可以做到這一點?我真的需要這樣做,以便我不必硬編碼一切。

回答

2

您需要將JLabel存儲在數組中。那就是:

JLabel[] labels = new JLabel[10]; 
// Fill that array with your JLables 
for (JLabel l : labels) { 
    l.setText("label"+i); 
} 

並且擺脫那些label1,label2,label3,...,label10變量;他們沒用。

這種類型的循環是for-each循環; for (JLabel l : labels)表示「對於陣列的每個JLabel,llabels「; documentation here.(謝謝Frakcool!)

+0

那麼這是如何工作的?你能解釋一下':'做什麼,這個程序在做什麼? –

+1

@LakshyaGoyal那種'for-loop'被稱爲''for-each''循環:參見[docs](http://docs.oracle.com/javase/1.5.0/docs/guide/language /foreach.html)。 ':'的意思是「開」,所以你可以閱讀上面的例子:「對於標籤上的每個JLabel l」 – Frakcool

+0

@Frakcool謝謝! – GKFX

3

沒有辦法在編譯時不知道它的確切名稱而引用變量。唯一的選擇是使用數組(或其他集合):

JLabel label0 = new JLabel(); 
JLabel label1 = new JLabel(); 
JLabel label2 = new JLabel(); 
JLabel label3 = new JLabel(); 
JLabel label4 = new JLabel(); 
JLabel label5 = new JLabel(); 
JLabel label6 = new JLabel(); 
JLabel label7 = new JLabel(); 
JLabel label8 = new JLabel(); 
JLabel label9 = new JLabel(); 

JLabel[] label = new JLabel[] { label0, label1, label2, label3, label4, label5, label6, label7, label8, label9 }; 
for (int i = 0; i < 10; i++) { 
    label[i].setText("label" + i); 
} 

爲了避免打字這麼多(以及可能的拼寫錯誤),你也許可以在迴路標籤以及:

JLabel[] label = new JLabel[10]; 
for (int i = 0; i < 10; i++) { 
    label[i] = new JLabel(); 
    label[i].setText("label" + i); 
} 

你可以仍然使用label[4]語法來引用特定標籤。注意數組從0開始索引,所以label[0]是第一個元素,label[9]是第10個(最後一個)元素。

+0

這看起來不錯,但我的問題是我實際嘗試做的簡化版本。我正在嘗試'.setIcon'。那麼你的方法仍然有效嗎?另外,因爲我的'JFrame'上有10個不同的'JLabels',我需要在循環內調用'repaint()'和'reValidate()'嗎? –

+1

'setIcon'應該像'setText'一樣工作。如果有的話,你可能想在父組件(框架或面板)上調用'repaint()'和'revalidate()'。您可以完成一次 - 完成更改所有標籤後。 –