2014-12-05 5 views
0

GridBagLayout에 대한 기본적인 내용이 누락 된 것 같습니다. 나는 라벨이 2 단위 폭이어야하고 텍스트 필드는 10 단위 넓이가되어야한다고 지정하려고합니다.GridBagLayout 구성 요소의 너비가 잘못 표시됩니다.

다음 코드는 내가하는 일을 모방합니다. 텍스트 필드와 라벨이 거의 동일한 양의 너비를 차지하는 것을 보여줍니다. 나는 무엇을 놓치고 잘못하고 있는가?

package numbers; 

import javax.swing.*; 
import java.awt.*; 

public class FooBar extends JFrame { 
    public static void main(String[] args) { 
     new FooBar(); 
    } 
    FooBar() { 
     super("Foobar"); 
     setSize(600,100); 

     JPanel panel = new JPanel(); 
     setLayout(new GridBagLayout()); 

     JLabel nLabel = new JLabel("Foo"); 
     JTextField nTextField = new JTextField("Bar"); 

     GridBagConstraints c = new GridBagConstraints(); 

     add(nLabel,   cs(0, 0, 2, 1, c.CENTER, c.NONE)); 
     add(nTextField,  cs(2, 0, 10, 1, c.CENTER, c.HORIZONTAL)); 

     add(panel); 
     setVisible(true); 
    } 

    private GridBagConstraints cs(int gridx, int gridy, 
      int gridwidth, int gridheight, 
      int anchor, int fill) { 
     GridBagConstraints c = new GridBagConstraints(); 
     c.gridx = gridx; 
     c.gridy = gridy; 
     c.gridwidth = gridwidth; 
     c.gridheight = gridheight; 
     c.anchor = anchor; 
     c.fill = fill; 

     c.weightx = 1; 
     c.weighty = 1; 
     return c; 
    } 
} 

은 내가 nLabel의 gridwidth 2 것을 지정 거라고 생각했고, nTextField의 gridwidth은 10 것을 나는 열은 동일한 weightx에는이 같은 폭 약이 될 것이라고 생각합니다. 그런데 왜 구성 요소의 너비가 같습니까? 그리고 컬럼의 크기가 다른 이유는 무엇입니까?

업데이트 :

추가 weightx에는 = 2 weightx에는 = 10이 코드를 수정하는 것 같다 ...하지만 더 큰 맥락에서 작동하지 않습니다. 내가 사용하는 코드는 다음과 같이 보입니다 : 나는 weightx = gridwidth;를 추가하여이 도우미 메서드 (CS)을 변경하여 해결 될 거라고 생각

add(intro1,   cs(0, 0, 12, 1, c.WEST, c.NONE)); 
    add(intro2,   cs(0, 1, 12, 1, c.WEST, c.NONE)); 
    add(nLabel,   cs(0, 3, 2, 1, c.CENTER, c.NONE)); 
    add(nTextField,  cs(2, 3, 10, 1, c.CENTER, c.HORIZONTAL)); 
    add(nthFoundLabel, cs(0, 4, 3, 1, c.CENTER, c.NONE)); 
    add(nFoundText,  cs(2, 4, 10, 1, c.CENTER, c.HORIZONTAL)); 
    add(blankLine,  cs(0, 5, 12, 1, c.CENTER, c.HORIZONTAL)); 
    add(startButton, cs(0, 6, 6, 1, c.CENTER, c.NONE)); 
    add(stopButton,  cs(6, 6, 6, 1, c.CENTER, c.NONE)); 
    add(blankLine,  cs(0, 7, 12, 1, c.CENTER, c.BOTH)); 
    add(progressLabel, cs(0, 8, 12, 1, c.CENTER, c.NONE)); 
    add(lastFoundLabel, cs(0, 9, 3, 1, c.CENTER, c.NONE)); 
    add(lastFoundText, cs(3, 9, 9, 1, c.CENTER, c.HORIZONTAL)); 
    add(lastNText,  cs(3, 10, 9, 1, c.CENTER, c.HORIZONTAL)); 
    add(elapsedLabel, cs(0, 11, 3, 1, c.CENTER, c.HORIZONTAL)); 
    add(remainingLabel, cs(0, 12, 3, 1, c.CENTER, c.HORIZONTAL)); 
    add(progressBar, cs(0, 13, 12, 1, c.CENTER, c.HORIZONTAL)); 

을하지만 여전히 문제가 해결되지 않습니다. 지구상에서 무슨 일이 일어나고있는거야?

+0

"2 단위"는 무엇을 의미합니까? 무슨 단위 요? – MadProgrammer

+0

두 구성 요소의 비율은 2:10이어야합니다. –

+0

0에서 1 사이의 값을 허용하면서 대신 'weightx'를 사용하십시오. – MadProgrammer

답변

2

각 하위 구성 요소에 대한 컨테이너 너비 분포는 가중치로 결정됩니다. gridwidth에 할당하는 값은 weightx에 대신 할당해야합니다. gridwidth는 모든 구성 요소에 대해 1 (또는 REMAINDER)이어야합니다.

gridwidth 및 gridheight는 구성 요소가 배치 된 크기를 변경하지 않습니다. 특히, gridwidth = 2 인 구성 요소는 이 아니고 gridwidth = 1 인 구성 요소의 두 배인이 아닙니다.

이름에 "Grid"라는 단어가 있더라도 GridBagLayout의 셀은 모두 같은 크기가 아닙니다. 그들은 단지 함께 정렬되어 있습니다. 각 셀을 보여 선을 그린 경우, GridBagLayout로는 다음과 같습니다

 
      _________________________________ 
      |   |    |  | 
(gridy=0) | gridx=1 | gridx=2 |gridx=3| 
      |_________|_______________|_______| 
      |   |    |  | 
      |   |    |  | 
(gridy=1) | gridx=1 | gridx=2 |gridx=3| 
      |   |    |  | 
      |_________|_______________|_______| 

gridwidth/구성 요소에 의해 점유되는 방법 GridBagLayout에의 세포의 수를 결정 gridheight의. gridwidth = 2를 구성 요소와 연관 시키지만 그리드 열에 다른 구성 요소가없는 경우 열의 너비를 유도하는 다른 구성 요소가 없기 때문에 효과는 gridwidth = 1과 동일합니다. gridwidth = 2 구성 요소가 2 셀 폭이지만이 두 셀은 여전히 ​​구성 요소의 기본 크기를 수용 할만큼 충분한 총 너비로 배치됩니다.

+0

확인. 이것은 좀 더 이해하기 시작합니다. 그러나 질문 : 다른 구성 요소 아래에 단추를 추가하려고합니다. 첫 번째 열의 크기를 조정하지 않기 때문에 첫 번째 열만 차지하고 싶지 않습니다. 이것이 가능한가? 두 개의 열 (예 : gridwidth = 2)을 사용하는 것이 맞지만이 방법은 효과가 없습니다. –

+0

예, 다른 모든 셀에 걸쳐 있어야하는 구성 요소의 경우 gridwidth를 1 이외의 값으로 설정하는 것이 맞을 것입니다. – VGR

관련 문제