2016-08-14 3 views
0

label1, label2, label3, ..., label10이라는 10 개의 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 제거, 라벨 2, LABEL3, ..., label10 변수; 유용하지 않습니다.

이 루프 유형은 for-each 루프입니다. for (JLabel l : labels)은 "배열의 각 JLabel l에 대해 labels"을 말합니다. documentation here.(감사 Frakcool!)

+0

어떻게 작동하나요? ':'무엇을하고이 프로그램은 무엇을하고 있는지 설명해 주시겠습니까? –

+1

@LakshyaGoyal 그 종류의 for-loop는 "for-each"루프라고 불립니다. [docs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language /foreach.html). ':'는 "on"을 의미하므로, 위의 예제를 다음과 같이 읽을 수 있습니다 : "레이블상의 각 JLabel l에 대해" – Frakcool

+0

@Frakcool Thanks! – 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]이 열 번째 (마지막) 요소임을 알 수 있습니다.

+0

이것은 좋아 보이는데, 제 질문은 제가 실제로하려고하는 것의 단순화 된 버전이었습니다. '.setIcon'을하려고합니다. 그럼 당신의 방법은 여전히 ​​효과가 있습니까? 또한 JFrame에 10 개의 서로 다른 JLabel을 가질 것이므로 루프 내에서 repaint() 및 reValidate()를 호출해야합니까? –

+1

'setIcon'은'setText'처럼 작동해야합니다. 전혀 없으면 부모 컴포넌트 (프레임 또는 패널)에서'repaint()'와'revalidate()'를 호출하기를 원할 것입니다. 모든 레이블을 변경 한 후에이 작업을 한 번 수행 할 수 있습니다. –

관련 문제