2012-09-20 4 views
0

다음 작업을 수행하려고하는데 어떤 유형의 Java 레이아웃을 사용할 것인지 잘 모르겠습니다.간단한 GUI Java 레이아웃 문제

단일 패널로 JFrame을 원합니다. totalPanel. totalPanel에는 내가 쓰는 사용자 정의 클래스 인 두 개의 패널, PanelA 및 PanelB가 있어야합니다. PanelA은 높이 200에서 시작하여 PanelB은 높이 400에서 시작됩니다. 사용자가 창을 확장하거나 창 크기를 조정하면 PanelB 만 높이가 증가해야하지만 두 패널 모두 너비가 증가 할 수 있습니다.

어떻게 설정하나요? BorderLayout을 사용하려고했지만 "북쪽"은 항상 너무 작습니다. BoxLayout을 사용하려고 시도했지만 그 다음에 PanelAPanelB은 항상 같은 높이입니다.

+0

시도한 것을 설명하기 위해 [SSCCE] (http://www.sscce.org)를 게시 할 수 있습니까? –

+1

GridBag를 사용해 보셨습니까? http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html –

답변

4

totalPanel에 BorderLayout을 사용하는 것이 좋습니다. PanelA를 BorderLayout.PAGE_START 위치에, PanelB를 BorderLayout.CENTER 위치에 추가합니다.

레이아웃 매니저에 대한 자세한 내용은 자습서를 검토하십시오 Lesson: Laying Out Components Within a Container

편집 : 나는 그것이 "작동하지 않습니다"하지만 당신은 코드를 표시하지 않습니다, 당신은 BorderLayout를 사용했습니다 것을 알 수있다. 왜 제대로 작동하지 않는지에 대한 자세한 튜닝을 위해서 우리에게 코드를 보여줄 것을 고려해보십시오.

작동 시키려면 JPanels의 초기 크기를 설정하는 데 도움이되는대체 값을 제공하는 PanelX 클래스를 제공하는 것이 좋습니다. 예를 들어

:
enter image description here

을 적절하게 크기를 조정합니다 : 실행하면

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.*; 

public class SimpleGuiLayout { 

    private static void createAndShowGui() { 
     JPanel totalPanel = new JPanel(new BorderLayout()); 

     totalPanel.add(new PanelX(800, 200, "Panel A"), BorderLayout.PAGE_START); 
     totalPanel.add(new PanelX(800, 400, "Panel B"), BorderLayout.CENTER); 
     JFrame frame = new JFrame("Simple Gui Layout"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(totalPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class PanelX extends JPanel { 
    private int prefW; 
    private int prefH; 

    public PanelX(int prefW, int prefH, String title) { 
     this.prefW = prefW; 
     this.prefH = prefH; 
     setBorder(BorderFactory.createTitledBorder(title)); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(prefW, prefH); 
    } 
} 

, 그렇게 같을 것이다.

3

하나의 접근법 (아마도 가장 간단한 것은 아님)은 GridBagLayout입니다.

weightx 및 weighty 제약 조건을 사용하여 크기를 조정할 수있는 멤버를 제어합니다.

3

나는 GridBagLayout을 권장한다. 사용하기가 복잡하지만 문제를 해결할 수 있습니다. 패널 a가 panelB의 상단에 가정하면, 다음과 같은 제약이 것 :

  • 패널 a 및 panelB의는 gridx 될 것이라고 0
  • 패널 a는 모두 gridy 1
  • 에서 광고 gridy 0, 및 panelB 것, 당신 채우기 설정합니다 = BOTH 패널 a의에 당신은 원래 솔루션 이미 작동의 BorderLayout을 사용하여, 당신은 단지 설정해야 0
0

을, 당신은 1.0 panelB의이 무게 설정합니다 높이 만 panelB 증가가 있고,뿐만

  • 패널 a의 바람직한 높이가 BorderLayout 북쪽 또는 남쪽 첨가 성분의 바람직한 폭을 무시하므로

    panelA.setPreferredSize(new Dimension(0, 200)); 
    

    너비 상관 없다.