2013-06-21 2 views
1

간단한 질문입니다 ... 기본적으로 레이아웃 고려 사항입니다. 아래 코드를 살펴 보겠습니다.기본 레이아웃에 대한 의견이 필요합니다.

figure A.

figure B

가 어떻게 그것을 달성 할 수 : 내가 좋아하는 것이 무엇

public class TestCode_Web { 

public static void main(String[] args) { 

    JFrame window = new JFrame("Test"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setSize(200, 300); 

    // Inner panel --------------------------------------------------------- 

    JPanel innerPanel = new JPanel(new BorderLayout()); 
    innerPanel.setBackground(new Color(250, 250, 200)); 
    window.add(innerPanel); 

    // Northern panel ------------------------------------------------------ 

    JPanel panelN = new JPanel(new BorderLayout()); 
    JLabel labelN = new JLabel("Label"); 

    panelN.add(labelN, BorderLayout.WEST); 
    panelN.setBackground(new Color(200, 250, 250)); 
    innerPanel.add(panelN, BorderLayout.NORTH); 

    // Center panel -------------------------------------------------------- 

    JPanel panelC = new JPanel(); 
    panelC.setBackground(new Color(250, 200, 250)); 

    JPanel panelCheckBoxes = new JPanel(new GridLayout(0, 1)); 

    final JCheckBox c1 = new JCheckBox("C1"); 
    final JCheckBox c2 = new JCheckBox("C2"); 
    final JCheckBox c3 = new JCheckBox("C3"); 
    panelCheckBoxes.add(c1); 
    panelCheckBoxes.add(c2); 
    panelCheckBoxes.add(c3); 

    int width = panelCheckBoxes.getPreferredSize().width; 
    int height = panelCheckBoxes.getPreferredSize().height; 
    panelCheckBoxes.setPreferredSize(new Dimension(width, height)); 

    panelC.add(panelCheckBoxes); 
    innerPanel.add(panelC, BorderLayout.CENTER); 

    // Southern panel -------------------------------------------------------- 

    JPanel panelS = new JPanel(new BorderLayout()); 
    JLabel labelS = new JLabel(String.valueOf(width) + "/" + String.valueOf(height)); 

    panelS.add(labelS, BorderLayout.WEST); 
    panelS.setBackground(new Color(250, 250, 200)); 
    innerPanel.add(panelS, BorderLayout.SOUTH); 

    // ... 

    window.setVisible(true); 

} 

} 

이를 가지고있다? 나는 여러 가지 방법이 있다고 생각합니다. 귀하의 다양한 제안을 기다리고 있습니다 ...

답변

0

getPreferredSize() 방법을 panelCheckBoxes으로 덮어 써서 panelC의 너비를 반환하는 것이 하나의 방법입니다. 이렇게하면 panelCheckBoxes '크기가 자동으로 panelC 너비에 맞춰집니다.

final JPanel panelC = new JPanel(); 
// [...] 
JPanel panelCheckBoxes = new JPanel(new GridLayout(0, 1)) { 
    public Dimension getPreferredSize() { 
     return new Dimension(panelC.getWidth(), 
          super.getPreferredSize().height); 
    } 
}; 

익명 내부 클래스 내에 panelC 액세스하기 위해, 그 final이어야한다 (즉, 초기화 후에 panelC 변수는 경우에는 아무런 문제가없는 새로운 가치를 부여 할 수 없음).

크기가 아직 알려지지 않았기 때문에 생성자에서 그 시점에 preferredSize을 설정하면 작동하지 않습니다. 그리고 (2) 크기가 변경 될 때 크기가 변경 될 수 있습니다.

// after window.setVisible(true); 
panelCheckBoxes.setPreferredSize(new Dimension(panelC.getWidth(), 
               panelCheckBoxes.getHeight())); 

그러나, 당신은 창 크기를 조정할 때 여전히이 방법 panelCheckBoxes 크기를 조정하지 않습니다 : 당신은, 그러나, panelC는 크기를 가지고 window.setVisible(true);에 호출 후 setPreferredSize를 사용할 수 있습니다.

그냥 체크 박스 왼쪽으로 정렬 (그러나 반드시 전체 폭에 걸쳐 스트레칭되지 않음)되도록하려면

, 간단한 방법은 BorderLayoutWEST 용기에 panelC를 넣어하는 것입니다. 색상은 디버깅 용이며 결국에는 모든 것이 같은 색상이 될 것이라고 가정하면 차이가 나타나지 않습니다.

마지막으로 더 복잡한 레이아웃의 경우 GridBadLayout을 확인해보십시오. 익숙해지기까지하지만 일단 숙달되면 노력할 가치가 있습니다.

+0

안녕하세요, Tobias, 먼저 답변 해 주셔서 감사합니다. 이제 몇 가지 질문이 있습니다. ** question # 1부터 시작하겠습니다. ** 'panelCheckBoxes'의 선언을 사용자가 지정한 것으로 바꾸려고 시도했지만 이상한 오류 메시지가 나타납니다. ' final이 아닌 변수 panelC는 다른 메소드에 정의 된 내부 클래스 내부에 있습니다. ' 이걸 없애기 위해 나는 무엇을 할 수 있습니까? –

+0

예, 고맙습니다. 사실 꽤 잘 작동합니다. 이제 ** question # 2 **가 생성자에서'preferredSize'를 설정하는 것에 대해 말한 내용이 될 것입니다. 그 코드 조각을 줄 수 있습니까? 이것은'getPreferredSize'와'setPreferredSize()'를 지정하는 사이의 요점을 정확하게 볼 수 없기 때문에 이론적 인 질문입니다.이 점에 대해 더 잘 이해할 수 있도록 도와 줄 수 있습니다. –

+0

OK, 더 나은 이해,하지만'setPreferredSize()'를 사용하는 것은 여전히 ​​잘 작동하지 않습니다. 저는 누락 된 _refresh() _ 메소드 호출이있는 것 같아요. 실제로'setPreferredSize'보다는 실제로'getPreferredSize'를 사용하는 것이 꽤 어렵습니다. * 컴퍼넌트의 폭을 설정합니다. –

관련 문제