2011-11-04 4 views
2

최근 Java에서 UI 개발을 시작했습니다. WPF에서 UI 개발을 해왔습니다. Java 수행 방법에 대한 몇 가지 사항이 혼란 스럽습니다.BoxLayout이있는 JPanel 내부 JButton의 크기가 예상대로 작동하지 않습니다.

내가 달성하고자하는 것은 버튼의 최소 크기를 설정하는 것입니다. 컨테이너가 폭 200 개 픽셀을 할당됩니다 경우

public class MainGameView extends JPanel { 
    public MainGameView(DefaultController controller) { 

     this.controller = controller; 
     CreateUI(); 
    } 

    private void CreateUI() { 
     MenuPanel = new javax.swing.JPanel(); 
     StartGameBtn = new JButton("Start Game"); 

     // Creating menu 
     MenuPanel.setLayout(new BoxLayout(MenuPanel, BoxLayout.Y_AXIS)); 
     MenuPanel.setPreferredSize(new Dimension(200, 200)); 

     StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);  
     StartGameBtn.setMinimumSize(new Dimension(200, 30)); 
     MenuPanel.add(StartGameBtn); 
    } 
} 

내 이해 그래서, 그에 따라 버튼에 폭 200 개 픽셀을 할당해야합니다 다음은 간단한 코드입니다. 그러나 버튼은 동일한 크기를 유지합니다. 내가 여기서 뭔가를 놓치고 있니?

답변

2

BoxLayout은 구성 요소를 가로로 늘이지 않으며 원하는 가로 채로 유지되도록합니다. 가로로 늘어지는 레이아웃 관리자를 사용해야합니다. , 자연 적절한 높이를 유지하고 MenuPanel 년대에 맞게 수평으로 뻗어 이것은 상단에있는 버튼을두고

MenuPanel.setLayout(new BorderLayout(0,0)); 
    MenuPanel.setPreferredSize(new Dimension(200, 200)); 
    StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);  
    MenuPanel.add(StartGameBtn, BorderLayout.NORTH); 

예를 들어, 당신이, 당신은 BorderLayout를 사용할 수하려고 노력하는 모습에 따라 너비는 크기가 조정 된 경우에도 마찬가지입니다. 또한 GridLayout (1 열로 구성된)을 보면 세로 열에 여러 구성 요소를 추가 할 수 있고 모든 구성 요소가 MainPanel의 전체 너비에 맞게 늘어날 것입니다.

3

레이아웃 관리자의 가장 큰 문제점 중 하나는 구성 요소의 크기를 설정하는 방법에 대해 서로 다른 규칙을 따르는 것입니다. 스윙은 서로 다른 레이아웃 관리자를 사용하여 여러 패널을 사용하는 "패널 내 패널"접근 방식을 사용하도록 장려하기 때문에 특히 실망 스럽습니다.

예를 들어, BoxLayout은 구성 요소를 가로로 늘리지 않고 대신 "기본 너비"를 준수합니다.

해결책? 패널 솔루션을 사용하여 패널을 계속 사용하고 레이아웃 관리자와 지속적으로 경쟁하거나 MigLayout이라는 타사 레이아웃 관리자를 사용할 수 있습니다.

MigLayout은 정말 유연하고 사용하기 쉽고 기본 스윙 레이아웃 관리자보다 훨씬 좋다고 생각합니다. 또한 Google WindowBuilder와 같은 것을 사용하는 경우 드래그 앤 드롭 GUI 빌더와 함께 MigLayout을 사용할 수 있으며 여전히 소스 코드에 직접 액세스 할 수 있습니다.

관련 문제