2012-10-31 2 views
2

동일한 양식의 여러 JLabel을 만든 다음 동일한 JPanel에 추가하려고합니다. 그러나 JLabel 중 하나만 나타나고 그 이유를 알 수 없습니다! 여기에 내가 쓴 그 코드 :하나만 나타나지만 여러 JLabel을 만들려고합니다.

final JPanel labelPanel = new JPanel(new BorderLayout()); 
    panel.add(labelPanel, BorderLayout.NORTH); 

    JLabel[] dashedLineLabel = new JLabel[wordLength]; 

    for (int i = 0; i < wordLength; i++) 
    { 
     dashedLineLabel[i] = new JLabel("__ "); 
     dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30)); 
     labelPanel.add(dashedLineLabel[i]); 
    } 

어떤 도움도 대단히 감사하겠습니다! 감사합니다.

답변

3

BorderLayout을 올바르게 사용하지 않습니다. 레이블은 모두 레이아웃의 가운데 위치에 추가되므로 서로 레이블을 덮어 씁니다. FlowLayout 대신 또는 MigLayout을 사용해보십시오.

+0

하나! :) –

+0

+1, MigLayout이 최고입니다. ;) – brimborium

1

BorderLayout을 사용하고 간단한 add 메서드가있는 구성 요소를 추가하는 경우 모두 중앙에 추가됩니다. 센터에 다른 컨테이너가 없다면, 그들은 모두 서로의 위에 있고, 당신은 단지 최고를 볼 수 있습니다. BorderLayout을 올바르게 사용하거나 다른 레이아웃을 사용하십시오. documentation of BorderLayout에서

:

A border layout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center. Each region may contain no more than one component, and is identified by a corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER. When adding a component to a container with a border layout, use one of these five constants, for example: 

    Panel p = new Panel(); 
    p.setLayout(new BorderLayout()); 
    p.add(new Button("Okay"), BorderLayout.SOUTH); 


As a convenience, BorderLayout interprets the absence of a string specification the same as the constant CENTER: 

    Panel p2 = new Panel(); 
    p2.setLayout(new BorderLayout()); 
    p2.add(new TextArea()); // Same as p.add(new TextArea(), BorderLayout.CENTER); 
+0

사실, 나는 그들이 서로의 위에 모두 누워 있다고 생각하지 않습니다. 셀 중 하나에 무언가가 추가되면 현재 배치 된 구성 요소가 제거됩니다. 내가 틀렸다면 나를 바로 잡아라. – brimborium

+0

@brimborium 나는 항상 그들이 서로의 위에 있다고 생각했지만 지금은 이것이 단지 가정이라는 것을 깨달았다. 실제로 일어난 일에 대해 어떤 언급도 찾을 수 없습니다. –

+1

실제로 시도해 볼 수 있습니다. BorderLayout을 사용하여 프레임이있는 패널을 만듭니다. 해당 레이아웃의 동일한 지점에 두 개의 레이블을 추가하십시오. 그런 다음 두 번째 레이블을 다시 제거하면 첫 번째 레이블이 다시 표시되지 않습니다. – brimborium

2

의 BorderLayout 사양은 말한다

테두리 레이아웃 배치와 5 개 지역에 맞게 그 구성 요소의 크기를 조정하는 컨테이너를 배치 : 북쪽, 남쪽, 동쪽, 서쪽, 센터. 각 영역에는 하나 이상의 구성 요소가 포함될 수 있으며 해당 상수로 식별되는 입니다 : NORTH, SOUTH, EAST, WEST 및 CENTER. 기본이 방법을 추가 사용으로

here에 보더 레이아웃을 사용해 컨테이너에 구성 요소, 사용이 다섯 개 상수 중 하나 ....

을 추가 할 때, 그것은에 구성 요소를 추가합니다 귀하의 경우에는 하나의 구성 요소 만 추가되는 것을 볼 수 있습니다.

다른 레이아웃 (예 : 흐름 또는 기타)을 사용하여 필요를 충족시킬 수 있습니다. BorderLayout.CENTER, BorderLayout.NORTH, BorderLayout.WEST, BorderLayout.SOUTH, BorderLayout.EAST : 그 레이아웃이 5 개 구성 요소 만 방을 가지고 있기 때문에

3

당신은 그것에 대해 BorderLayout을 사용할 수 없습니다. 레이아웃에 내장 중 하나

솔루션 : 내가 사용하는 것이 좋습니다 것

FlowLayout 또는 GridLayout, 당신이 원하는에 따라 달라집니다. 여전히 BorderLayout을 외부 패널로 사용할 수 있지만 위에서 언급 한 레이아웃 중 하나를 사용하는 내부 패널을 소개하기 만하면됩니다.

따라서 GridLayout을 사용하면 라벨을 격자 레이아웃으로 포장 한 다음 테두리 레이아웃에 배치 할 수 있습니다.코드는 다음과 같습니다 MigLayout와

panel.setLayout(new BorderLayout()); 
final JPanel upperPanel = new JPanel(); 
panel.add(upperPanel, BorderLayout.NORTH); // add some stuff in the north 

final JPanel innerPanel = new JPanel(new GridLayout(1,0)); 
JLabel[] dashedLineLabel = new JLabel[wordLength]; 
for (int i = 0; i < wordLength; i++) { 
    dashedLineLabel[i] = new JLabel("__ "); 
    dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30)); 
    innerPanel.add(dashedLineLabel[i]); 
} 

panel.add(innerPanel, BorderLayout.CENTER); 

솔루션 :

당신이 다른 레이아웃 사이에서 선택을하지 않으려면, 당신은 또한 제 3 자 레이아웃 매니저입니다 MigLayout을 사용할 수 있습니다, 기본적으로 한 관리자의 모든 옵션을 제공합니다. 그리고 더 깨끗한 코드 (imho)를 갖게 될 것입니다. 물론 단점은 외부 jar 파일을 종속성으로 사용해야한다는 것입니다. (그런데 : 나는 MigLayout에 대해 알게 이후, 다시 또 다른 레이아웃 매니저를 사용한 적이있다.)

MigLayout으로 : 그 MigLayout를 들어

final JPanel labelPanel = new JPanel(new MigLayout("", "", "")); 
panel.add(labelPanel, "north"); 

JLabel[] dashedLineLabel = new JLabel[wordLength]; 
for (int i = 0; i < wordLength; i++) { 
    dashedLineLabel[i] = new JLabel("__ "); 
    dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30)); 
    panel.add(dashedLineLabel[i], "wrap"); 
} 
관련 문제