본문 바로가기

Language/Java

Swing Layout

[LayoutManager] 

 _레이아웃 관리자

 

 

GUI프로그램의 화면구성은 매우 중요함

             따라서 대부분의 GUI프로그램을 개발시 도구를 지원

             그러나 자바에서는 GUI를 구성하는 개발 도구를 기본 버전에서는 지원하지 않음

 

도구를 사용하지 않고 가장 효율적으로 컴포넌트 배치관리 방법

             레이아웃 관리자는 컴포넌트 배치 역할을 하는 레이아웃 관리자를 사용

             컨테이너 클래스를 상속받는 클래스에서만 사용가능

                           Panel, Frame, Window, Dialog, ScrollPane등

             레이아웃의 종류

                           FlowLayout, GridLayout, BorderLayout, CardLayout, GridBagLayer 등 

  

수동 Layout의 장점 단점.

 

             장점        : 수동으로 컴포넌트를 배치하는 작업은 개발자가 원하는 대로 화면을 구성할수 있음

             단점

                           : 시간 면에서는 아주 고되고 힘들다

                             모든 화면에서 동일하게 실행되는 화면을 구성하기도 매우 어려움

 

 

 


*컨테이너의 레이아웃을 변경하는 메소드

 

주체.setLayout(LayoutManager m);

 

setLayout 메소드는 JFrame에 얹을 컴포턴트의 배치 방법을 지정하는 메소드이다. 물론배치와 관련이있으니 당연히 이 메소드는 java.awt.Container클래스에 정의되어있다. 그런데 인자로 FlowLayout인스턴스를 받는다.

즉 "나는 컴포넌트의 배치를 FlowLayout인스턴스에게 위임한다."


super.setLayout(new FlowLayout()); 

  

 



* FlowLayout


=> 컴포넌트들이 추가되는 순서에 따라 왼쪽에서 오른쪽으로 이어져나가며, 공간이 부족하면, 아랫줄에 추가됨.

=> 컨테이너의 크기가 변경되면 컴포턴트들의 위치는 변하고 크기는 고정.

ex) Applet, Panel 컨테이너가 기본 레이아웃으로 가지고 있음.

 

=> 생성자

FlowLayout() : 가운데 정렬이면서 hgap과 vgap이 5픽셀인 FlowLayout을 생성

FlowLayout(int align) : hgap과 vgap이 5픽셀인 FlowLayout을생성, align - 컴포넌트들의 정렬 방법지정.

FlowLayout(int align, int hgap, int vgap) : 

align : 컴포넌트들의 정렬방법을 지정 ( FlowLayout.Left, FlowLayout.CENTER, FlowLayout.RIGHT 중 하나를 지정 )

hgap - 각 컴포넌트간의 좌우 간격을 줌.

vgap - 각 컴포넌트간의 상하 간격을 줌.

 

 

 

 

* BorderLayout 

 

=> 컨테이너를 West, East, Center, South, North 모두 5개의 영역으로 나누고, 각영역에 하나의 컴포넌트만을 배치할수있다 

=> 컨테이너의 크기가 변경되면 컴포넌트들의 위치는 고정, 크기가 변한다.

     North, South는 가로 변경, West와 East는 세로가 변경

     Center는 가로 세로 모두 변경된다.

    ex) Frame, Dialog 컨테이너가 기본 레이아웃으로 가지고잇음.

 

=> 생성자

BorderLayout() : 영역사이에 간격이 없는 BorderLayout을 생성함.

BorderLayout(int hgap, int vgap) : 각 영역 사이에 간격이 있는 BorderLayout을 생성.

 

=> BorderLayout배치관리자를 사용하고 있는 컨테이너 위에 컴포넌트를로 올리려면 영역지정이 필요함, 지정하지 않으면 Center에 추가됨

   주체.add(Componet c, String name);

   주체.add(String name, Componet c);

   - c : 추가하려는 컴포넌트

   - name : "North", "South", "East", "West", "Center" 중의 하나 (대소문자 구별)

              또는 BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST, BorderLayout.WEST, BorderLayout.CENTER

 

ex) 주체.add(new Button("클릭"), Border.Layout.CENTER);

      주체.add(new Button("클릭"),"Center");

      주체.add(콤포넌트,넣을영역);

 



* GridLayout

 => 행과 열을 만들어 컴포넌트들을 컨테이너위에 순서대로 올린다.

 => 컨테이너 크기가 변경되면 컴포넌트들의 위치는 고정, 크기는 모두 동일한 크기로 변경된다.

 => 생성자

 

GridLayout(int row, int col) : 영역들 간의 사이에 간격이 없는 GridLayout을 생성, 

- row : 컨테이너를 몇개의 행(row)으로 나눌것인지 적는다.

- col : 컨테이너를 몇개의 열(column)로 나눌것인지 적는다.

GrindLayout(int row, int col, int hgap, int vgap)

 

 

ex) 주체.setLayout(new GridLayout(3, 2)); //3행 2열

     주체.setLayout(new GridLayout(0, 2)); //열은 무조건 2열이고 행이 늘어난다.

     주체.setLayout(new GridLayout(3, 0)); //행은 무조건 3행이고 열이 늘어난다.

     주체.setLayout(new GridLayout()); //한행에 열이 늘어난다.

 

* GridBagLayout

  GridBagLayout은 GridLayout과 같이 컨테이너를 열과 행으로 나누어 컴포넌트들을 배치할수있다. 각 영역은 서로 다른 크기로 지정될수있으며, 인접한 열또는행으로 확장이 가능. 마치 HTML문서에서의 Table의 레이아웃을 설정하는 것과 비슷.




* CardLayout

  CardLayout은 여러 화면을 슬라이드처럼 바꿔가며 보여 줄수있다.


 

     

* 하나의 JFrame에 둘 이상의 배치 관리자 적용하기!

=> 하나의 컨테이너(JFrame)는 2개 이상의 레이아웃을 가지지 못한다.

=> 그래서, JPanel 컴포넌트 이용

 

 

 

 

===========================================================================================================================

레이아웃 매니저 -> FlowLayout


 

 [코드] FlowLayoutExam.java - FlowLayout 예제

 /*FlowLayoutExam.java*/


import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class FlowLayoutExam extends JFrame { 

    /** 
     * 필요한 필드 선언 
     */
 
    JButton btn1 = new JButton("버튼1"); 
    JButton btn2 = new JButton("버튼2"); 
    JButton btn3 = new JButton("버튼3"); 
    FlowLayout flow = new FlowLayout(); 

    /** 
     * 화면구성 생성자 
     */
 
    public FlowLayoutExam() { 
        super("First Swing"); // 타이틀지정 
        //setLayout(new FlowLayout(FlowLayout.CENTER, 10, 150)); // 
        //public FlowLayout(int align, int hgap, int vgap)//생성자참고
        //레이아웃 변경 
        super.setLayout(flow); 

        // 추가 
        add(btn1); // 컨테이너에 컴포넌트 추가 
        add(btn2); 
        add(btn3); 

        // 크기지정 
        setSize(300400); 
        // 보여줘 
        setVisible(true); 

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // x버튼 활성 
    } 

    public static void main(String[] args) { 
        new FlowLayoutExam(); 
    } 

 

 

 

레이아웃 변경 -> setLayout(new FlowLayout())


 

// 레이아웃 변경 

// 컨테이너에 컴포넌트추가

// 크기지정

// 보여줘

 

 

 

 

 

 

 

===========================================================================================================================


 

레이아웃 매니저 -> BorderLayout

 

 

 

 [코드] BorderLayoutManager.java - BorderLayout 예제

 /*BorderLayoutManager.java*/


import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class BorderLayoutManager extends JFrame { 
    private static final Object East = null
    JButton btn1 = new JButton("버튼 (동) Eest"); 
    JButton btn2 = new JButton("버튼 (서) West"); 
    JButton btn3 = new JButton("버튼 (남) South"); 
    JButton btn4 = new JButton("버튼 (북) North"); 
    JButton btn5 = new JButton("버튼 (가운데) Center"); 
    // BorderLayout bl = new BorderLayout(20,10); 
    BorderLayout bl = new BorderLayout(); 
    //JFrame의 기본레이아웃이기때문에 생략가능함

    public BorderLayoutManager() { // 생성자 
        super("BorderLayoutManager"); 
        // 레이아웃변경 
        // super.setLayout(bl); 

        // 추가 
        /* 
         * add(btn1,BorderLayout.EAST); add(btn2,BorderLayout.WEST); 
         * add(btn3,BorderLayout.SOUTH); add(btn4,BorderLayout.NORTH); 
         * add(btn5,BorderLayout.CENTER); 
         */
 
        add(btn1, "East"); //add(콤버넌트, BorderLayout.영역)
        add(btn2, "West"); //add(BorderLayout.영역, 콤버넌트) 
        add(btn3, "South"); 
        add(btn4, "North"); 
        add(btn5, "Center"); 

        // 크기지정 
        super.setSize(500400);
        //super.pack(); //자동크기지정
        // 보이게 
        super.setVisible(true); 
        // x버튼 활성 
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public static void main(String[] args) { 

        new BorderLayoutManager(); 
    } 

 

 

* 참고 : super.pack();//자동크기(컴포넌트들이 올려진후의 최소의 크기);  적용후

 

 

* 참고: super.setLayout(new BorderLayout(10,20));  //( hgab , vgab )

 

 

 

 

===========================================================================================================================

 

레이아웃 매니저 -> GridLayout

 

 

 

 

 

 [코드] GridLayoutExam.java - GridLayout 예제

 /*GridLayoutExam*/


package e0426.gui; 

import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class GridLayoutExam extends JFrame { 
    public GridLayoutExam() { // 생성자 
        super("GridLayoutExam"); 
        // 레이아웃 변경 
        super.setLayout(new GridLayout(32)); // 3행 2열 
        // super.setLayout(new GridLayout(0,3)); //열은 무조건 3열이고 행이 늘어난다 
        // super.setLayout(new GridLayout(2,0)); //행은 무조건 2행이고 열이 늘어난다. 
        // super.setLayout(new GridLayout()); //한행에 열이 늘어난다. 

        // 추가 
        add(new JButton("버튼 1")); 
        add(new JButton("버튼 2")); 
        add(new JButton("버튼 3")); 
        add(new JButton("버튼 4")); 
        add(new JButton("버튼 5")); 
        add(new JButton("버튼 6")); 
        // 크기 
        super.setSize(300400); 
        // 보이기 
        super.setVisible(true); 
        // x 버튼 활성화 
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
        new GridLayoutExam(); 
    } 

 

 

 

 [코드] Win10_Layout.java - GridLayout 을 이용한 로그인창

import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField
 
public class Win10_Layout extends Frame{    
     Label lblId;
     Label lblPwd;
     TextField txtId;
     TextField txtPwd;
    
     public Win10_Layout(){
         
          GridLayout gu = new GridLayout(2,2);
          setLayout(gu);
          lblId = new Label("아이디");
          txtId = new TextField();
         
          lblPwd = new Label("비밀번호");
          txtPwd = new TextField();
         
          add(lblId);
          add(txtId);
          add(lblPwd);
          add(txtPwd);
         
          setSize(200100);
          setVisible(true);
     }
    
    
     public static void main(String[] args) {
          new Win10_Layout();
     }
}

 

 

 

 

 

===========================================================================================================================

레이아웃 매니저 -> 하나의 JFrame에 둘이상의 배치 관리자 적용하기(Panel 활용)

 

 

 

 

 

 [코드] PanelLayout.java - 하나의 JFrame에 둘이상의 배치 관리자 적용하기(Panel 활용)

import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JPanel

public class PanelLayoutExam extends JFrame { 

    JButton btn1 = new JButton("WestButton")
    JButton btn2 = new JButton("CenterButton")

    JPanel jpn = new JPanel()
    JButton btn3 = new JButton("File")
    JButton btn4 = new JButton("Help")

    public PanelLayoutExam() { 
        super("PanelLayoutExam")
        // 레이아웃 변경 

        // JPanel에 컴포넌트 추가 
        jpn.add(btn3)
        jpn.add(btn4)

        // JFrame에 컴포넌트 추가 
        add(jpn, "North")
        add(btn1, "West")
        add(btn2, "Center")

        // 크기 
        setSize(300200)
        // super.pack(); 
        // 보이기 
        setVisible(true)
        // x : 종료 
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    } 

    public static void main(String[] args) { 
        new PanelLayoutExam()
    } 
}

 

 

 

 

===========================================================================================================================

레이아웃 매니저 ->  수동으로 레이아웃 배치 ( 배치관리자 해제 : setLayout(null) )

 

 

 

 [코드] MemberRegister.java - 배치관리자 해제후 수동으로 컴포넌트 배치 : setLayout(null)

import java.awt.*;
 
public class MemberRegister extends Frame{
    
     Label lblId, lblPwd, lblName, lblHp, lblGen, lblHobby,lblJob,lblAddr,lblAge ;
     TextField txtId, txtPwd, txtName;
     TextField txtHp1, txtHp2, txtHp3;
     Checkbox cbMale,cbFeMale;
     Checkbox cbHobby1, cbHobby2, cbHobby3;
     Choice chJob;
     TextField txtAddr,txtAge;
     Button btnSubmit, btnCancel;
    
     public MemberRegister() {
         
          super("회원가입");
          setLayout(null);
         
          lblId =new Label("아이디");
          lblPwd=new Label("패스워드");
          lblName=new Label("이름");
          lblHp=new Label("핸드폰");
          lblGen=new Label("성별");
          lblHobby=new Label("취미");
          lblJob=new Label("직업");
          lblAddr=new Label("주소");
          lblAge =new Label("나이");
         
          lblId.setBounds(205010020);
          lblPwd.setBounds(208010020);
          lblName.setBounds(2011010020);
          lblHp.setBounds(20140100 , 20);
          lblGen.setBounds(2017010020);
          lblHobby.setBounds(2020010020);
          lblJob.setBounds(2023010020);
          lblAddr.setBounds(2026010020);
          lblAge.setBounds(2029010020);
         
          add(lblId);
          add(lblPwd);
          add(lblName);
          add(lblHp);
          add(lblGen);
          add(lblHobby);
          add(lblJob);
          add(lblAddr);
          add(lblAge);
         
          txtId =new TextField(20);
          txtPwd =new TextField(20);
          txtName= new TextField(20);
          Label lblhipen1 = new Label("-");
          Label lblhipen2 = new Label("-");
          txtHp1 = new TextField();
          txtHp2 = new TextField();
          txtHp3 = new TextField();
         
          Panel panGen = new Panel(new FlowLayout(FlowLayout.LEFT));
          Panel panHobby = new Panel(new FlowLayout(FlowLayout.LEFT));
    
          CheckboxGroup group = new CheckboxGroup();
          cbMale = new Checkbox("남자",group,true);
          cbFeMale = new Checkbox("여자",group,false);
         
          panGen.add(cbMale);
          panGen.add(cbFeMale);
          panGen.setBounds(12016210030);         
         
         
          cbHobby1 = new Checkbox("자전거");
          cbHobby2 = new Checkbox("컴퓨터");
          cbHobby3 = new Checkbox("독서");
          panHobby.add(cbHobby1);
          panHobby.add(cbHobby2);
          panHobby.add(cbHobby3);
         
          panHobby.setBounds(12019220030);
         
          chJob = new Choice();
          chJob.add("자바프로그래머");
          chJob.add("임베디드프로그래머");
          chJob.add("웹프로그래머");
          chJob.add("모바일프로그래머");
         
          txtAddr = new TextField();
          txtAge = new TextField();
         
          btnCancel = new Button("취소");       
          btnSubmit = new Button("가입완료");
          //btnCancel.setSize(150, 40 );
          //btnSubmit.setSize(150, 40);
         
          txtId.setBounds(1205015020);
          txtPwd.setBounds(1208015020);
          txtName.setBounds(12011015020);
          txtHp1.setBounds(1201406020);
          lblhipen1.setBounds(1901401020);
          txtHp2.setBounds(2101406020);
          lblhipen2.setBounds(2751401020);
          txtHp3.setBounds(2901406020);
                  
          chJob.setBounds(120,23015020);
          txtAddr.setBounds(12026015020);
          txtAge.setBounds(12029015020);
         
         
          Panel paButton = new Panel();
          paButton.add(btnSubmit);
          paButton.add(btnCancel);
          paButton.setBounds(0320370370);
             
    
         
          add(txtId);
          add(txtPwd);
          add(txtName);
          add(txtHp1);
          add(lblhipen1);
          add(txtHp2);
          add(lblhipen2);
          add(txtHp3);
          add(panGen);
          add(panHobby);
          add(chJob);
          add(txtAddr);
          add(txtAge);
          add(paButton);
         
          setSize(370370);
          setResizable(false);
          setVisible(true);
         
     }
    
     public static void main(String[] args) {
          new MemberRegister();
     }   
}