2014-10-06 5 views
0

현재 버튼 클릭시 요소를 동적으로 요소에 추가하는 테스트 함수를 작성하고 있습니다. GridBagLayout을 사용하고 있습니다. 내 함수의 코드는 다음과 같습니다.GridBagLayout은 요소를 잘못 표시합니다.

public void buildGui(){ 
     ConnectionInfoPanel.removeAll(); 
     //test first group of items 
     listOfLabels.add(new JLabel("Label 1")); 
     listOfLabels.add(new JLabel("Label 2")); 
     listOfLabels.add(new JLabel("Label 3")); 
     listOfLabels.add(new JLabel("Label 4")); 

     GridBagConstraints c = new GridBagConstraints(); 
       c.weightx = 1; 
       c.weighty = 1; 
       c.insets = new Insets(10,10,10,10); 
       c.anchor = GridBagConstraints.NORTHWEST; 

     ConnectionInfoPanel.add(listOfLabels.get(0), c); 
     ConnectionInfoPanel.add(new JLabel(), c); 

     ConnectionInfoPanel.add(listOfLabels.get(1), c); 
     ConnectionInfoPanel.add(new JLabel(), c); 


     ConnectionInfoPanel.add(listOfLabels.get(2), c); 
     ConnectionInfoPanel.add(new JLabel(), c); 

     ConnectionInfoPanel.add(listOfLabels.get(3), c); 
     ConnectionInfoPanel.add(new JLabel(), c); 

     //test second group 
     listOfLabels.add(new JLabel("Label 5")); 
     listOfLabels.add(new JLabel("Label 6")); 
     listOfLabels.add(new JLabel("Label 7")); 
     listOfLabels.add(new JLabel("Label 8")); 

     GridBagConstraints x = new GridBagConstraints(); 
       x.weightx = 1; 
       x.weighty = 2; 
       x.insets = new Insets(10,10,10,10); 
      // x.anchor = GridBagConstraints.NORTHWEST; 

     ConnectionInfoPanel.add(listOfLabels.get(4), x); 
     ConnectionInfoPanel.add(new JLabel(), x); 

     ConnectionInfoPanel.add(listOfLabels.get(5), x); 
     ConnectionInfoPanel.add(new JLabel(), x); 


     ConnectionInfoPanel.add(listOfLabels.get(6), x); 
     ConnectionInfoPanel.add(new JLabel(), x); 

     ConnectionInfoPanel.add(listOfLabels.get(7), x); 
     ConnectionInfoPanel.add(new JLabel(), x); 

     ConnectionInfoPanel.updateUI(); 
    } 

첫 번째 요소 그룹에서는 모든 것이 정상적으로 작동합니다. 그들은 왼쪽 상단 구석 (0,0)에서 선으로 눕습니다.

두 번째 요소 그룹에서 시작 위치는 패널의 중심 (Y 축)과 Label4의 끝 (X 축)이됩니다. 하지만 내가 달성하고자하는 것은 시작 위치를 (0, 1)로 설정하는 것입니다. 따라서이 그룹은 첫 번째 그룹 바로 아래에 표시됩니다. 누구든지 내가 뭘 잘못하고 있는지 보여 줄 수 있니?

답변

1

당신은 그리드 제약에 는 gridxgridY 값을 설정해야하거나 레이아웃 매니저는 어디에 구성 요소를 넣어하는 방법을 모르고있다.

그리고 당신은 또한 gridX와 gridY와 함께 weightXweightY을 혼동한다고 생각합니다. 두 가지가 있습니다. 각 구성 요소에 대해

이 같은 제약 조건을 재설정 : 당신이 목록이 얼마나 오래 모르는 경우

GridBagConstraints c = new GridBagConstraints(); 

c.gridx = 0; 
c.gridy = 0; 


ConnectionInfoPanel.add(listOfLabels.get(0), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(1), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(2), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(3), c); 

c.gridx = 0; 
c.gridy = 1; 


ConnectionInfoPanel.add(listOfLabels.get(4), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(5), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(6), c); 
c.gridx++; 
ConnectionInfoPanel.add(listOfLabels.get(7), c); 

는, 당신은 지속적으로 Y를 증가 몇 가지 루프를 추가해야합니다.

또는 두 개의 flowlaout 패널에 두 행을 추가 할 수 있습니다, 그리고 그래서 같은 gridbaglaout 패널이 추가

JPanel panel1 = new JPanel(); 
panel1.add(listOfLabels.get(0)); 
panel1.add(listOfLabels.get(1)); 
panel1.add(listOfLabels.get(2)); 
panel1.add(listOfLabels.get(3)); 
ConnectionInfoPanel.add(panel1, c); 


JPanel panel2 = new JPanel(); 
panel2.add(new JLabel("Label 5")); 
panel2.add(new JLabel("Label 6")); 
panel2.add(new JLabel("Label 7")); 
panel2.add(new JLabel("Label 8")); 

GridBagConstraints x = new GridBagConstraints(); 
x.weightx = 1; 
x.weighty = 2; 
x.insets = new Insets(10, 10, 10, 10); 
// x.anchor = GridBagConstraints.NORTHWEST; 

x.gridy = 0; 
ConnectionInfoPanel.add(panel1, x); 
x.gridy = 1; 
ConnectionInfoPanel.add(panel2, x); 
+0

이 레이블은 미친 가서 여기 저기를 표시 할 수 있습니다. 나는 불행하게도 나는 요소의 제어를 느슨하게 시도했다. – iColdBeZero

+0

그러나 layoutmanager는 어떻게 든 요소를 ​​넣으려는 위치를 알아야합니다. 두 개의 레이블 세트를 두 개의 flowLayout 패널에 넣은 다음 두 개의 요소로이를 격자판 레이아웃 패널에 추가 할 수도 있습니다. –

+0

내 업데이트 된 답변보기 –

관련 문제