2016-08-14 98 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()'。您可以完成一次 - 完成更改所有标签后。 –