2017-10-29 9 views
0

에 중간 패널 뷰의 중심을 나는 UI 3 개 패널, leftPanel, middlePanelrightPanel을 구축해야, 패널 Horizontally어떻게 스윙

left을 정렬해야하며 right 패널로 maximumequal 폭을 얻어야한다 가능한 한 중간 패널은 하위 컴포넌트로 너비가 minimum이 될 수 있지만 일단 패널이 추가되면보기는 가운데 패널로 중앙에 위치해야합니다.

가 나는 UI 내가 오라클 스윙 튜토리얼 사이트에서 Rule 클래스를 사용했다

import java.awt.Color; 
import java.awt.GridBagLayout; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class SwingTest extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public SwingTest() { 
     setTitle("Swing Test"); 
     setSize(750, 350); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(getParent()); 

     // Rule used to find the component positions, for the testing purpose 
     Rule rule = new Rule(Rule.HORIZONTAL, true); 
     rule.setPreferredWidth(10); 
     rule.setPreferredHeight(40); 

     SidePanel leftPanel = new SidePanel("Left"); 
     SidePanel rightPanel = new SidePanel("Right"); 

     JPanel middlePanel = new JPanel(); 
     middlePanel.setBorder(BorderFactory.createLineBorder(Color.black)); 

     // Add left,right and middle panel horizontally 
     JPanel containerPanel = new JPanel(); 
     containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.X_AXIS)); 
     containerPanel.add(leftPanel); 
     containerPanel.add(middlePanel); 
     containerPanel.add(rightPanel); 

     // Add rule and container panel Vertically 
     JPanel outerPanel = new JPanel(); 
     outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS)); 
     outerPanel.add(rule); 
     outerPanel.add(containerPanel); 

     add(outerPanel); 
    } 

    public static void main(String[] args) { 
     SwingTest test = new SwingTest(); 
     test.setVisible(true); 
    } 

    private static class SidePanel extends JPanel { 
     private static final long serialVersionUID = 1L; 

     private SidePanel(String text) { 
      setLayout(new GridBagLayout()); 
      add(new JLabel(text)); 
     } 
    } 
} 

을 구축하는 테스트 코드를 다음과 같은 짓을, 구성 요소의 위치를 ​​찾을 수 있습니다. Rule.java

내가 UI 스크린 샷과 같이있다가 문제,보기를 가운데 패널 중심으로 얻을되지 얻을, 지금보기는 왼쪽 + 중간 패널 = 오른쪽 패널 '

I'의 폭으로 중심 수동으로 패널 높이와 너비를 설정하지 않으려면 LayoutManager 자체에서 처리해야합니다. 내가 원하는 무엇

enter image description here

중간 패널 방식 left + middle/2 = middle/2 + right 패널 폭 중심으로 얻을 수있다이다.

중간 패널을 중앙에 배치하여 볼 수있는 방법을 찾지 못했습니다. 누군가이 솔루션을 찾도록 도와 줄 수 있습니까?

답변

1

BoxLayout의 작동 방식을 이해해야합니다.

첫 번째 공간은 각 구성 요소의 기본 크기로 할당됩니다. 그런 다음 여분의 공간이 있으면 해당 공간이 각 구성 요소에 할당됩니다.

오른쪽 레이블의 기본 크기가 왼쪽 레이블보다 크기 때문에 가운데 맞춤이 나타나지 않습니다. 따라서 여분의 공간이 할당되면 오른쪽이 왼쪽보다 큽니다.

이것은 쉽게 테스트 할 수 있습니다. 오른쪽 패널의 텍스트를 "LEFT"로 변경하면됩니다.

하지만 다른 질문이 생깁니다. 왜 중간 패널의 크기가 변하지 않습니까? 나는 이것에 대한 답을 모른다. 어떤 이유로 인해 기본 FlowLayout이 GridBagLayout과 다르게 작동하는 것으로 보입니다. 다시 한번, 중간 패널의 레이아웃을 GridBagLayout으로 변경하여이를 테스트 할 수 있습니다.

왼쪽/오른쪽 패널의 크기를 항상 같게하려면 Relative Layout을 사용하는 것이 좋습니다. 기본 코드는 것이 레이아웃을 사용하여 :

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS); 
JPanel panel = new JPanel(rl); 
panel.add(leftPanel, new Float(1)); 
panel.add(middle, new Float(3)); 
panel.add(rightPanel, new Float(1)); 

이제 왼쪽/오른쪽 패널은 각 패널에 추가 구성 요소에 관계없이 같은 크기 일 것이다.