Lang/Java

AWT - 레이아웃 매니저

진욱 김 2023. 3. 28. 10:16
728x90
반응형

1. 레이아웃 매니저란

  • 컨테이너에 포함된 컴포넌트들의 배치를 자동적으로 관리
  • 컨테이너의 크기가 변경될 경우, 컴포넌트의 재배치를 자동적으로 관리
  • 컨테이너당 하나의 레이아웃 매니저 설정 가능
  • 모든 컨테이너는 기본적으로 레이아웃 매니저가 지정되어있다
  • 종류
    • BorderLayout - Window, Dialog, Frame의 기본 레이아웃
    • FlowLayout - Panel, Applet의 기본 레이아웃
    • GridLayout
    • CardLayout

2. Border Layout

  • 컨테이너를 North, South, East, West, Center 5개의 영역으로 나눈다
  • 각 영역에 하나의 컴포넌트만 배치 가능
  • 한 영역에 여러개의 컴포넌트 배치시, 마지막에 추가한 컴포넌트만 출력
  • 한 영역에 하나 이상의 컴포넌트를 넣으려면 Panel 이용
  • 생성자
    • BorderLayout(int hdap, int vgap) : 각 영역 사이에 간격이 있는 레이아웃 생성
    • hgap : 좌우간격, vgap : 상하간격
    • BorderLayout() : 간격없는 레이아웃 생성
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;

public class BorderTest {

    public static void main(String[] args) {
        Frame f = new Frame("BorderLayout");
        f.setSize(200,200);

        f.setLayout(new BorderLayout());

        //
        Button btN = new Button("North");
        Button btS = new Button("South");
        Button btE = new Button("East");
        Button btW = new Button("West");
        Button btC = new Button("Center");

        f.add(btC,"Center");
        f.add("North",btN);
        f.add(btS,"South");
        f.add(btE,BorderLayout.EAST);
        f.add(btW,"West");

        f.setVisible(true);
    }
}

border


3. FlowLayout

  • 컴포넌트들이 추가되는 순서에 따라 왼쪽에서 오른쪽으로 이어져나간다
  • 컴포넌트를 원래의 크기 그대로 배치한다
  • 공간이 부족하면 아랫줄에 추가된다
  • 생성자
    • FlowLayout(int align, int hgap, int vgap)
      • align : 정렬방법, 기본값 가운데정렬
        • FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.Right
      • gap : 컴포넌트 간격, 기본값 5픽셀
import java.awt.*;

public class FlowLayout {

    public static void main(String[] args) {
        Frame f = new Frame("FlowLayout");
        f.setSize(250,100);
        f.setLayout(new FlowLayout(FlowLayout.RIGHT));

        f.add(new Button("첫번째"));
        f.add(new Button("두번째"));
        f.add(new Button("세번째"));
        f.add(new Button("네번째"));
        f.add(new Button("다섯번째"));

        f.setVisible(true);

    }

}

f


4. GridLayout

  • 컨테이너를 테이블처럼 행과 열로 나누어 컴포넌트 배치
  • 컴포넌트들은 모두 같은 크기로 나누어진다
  • 컨테이너 크기를 변경하면 각 영역이 같은 비율로 변한다
  • 생성자
    • GridLayout(int row, int col, imt hgap, int vgap)
    • row : 행, col: 열, gap : 간격
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;

public class GridTest {

    public static void main(String[] args) {
        Frame f = new Frame("grid test");
        f.setSize(150,150);

        f.setLayout(new GridLayout(3,2)); //3행 2열

        f.add(new Button("1"));
        f.add(new Button("2"));
        f.add(new Button("3"));
        f.add(new Button("4"));
        f.add(new Button("5"));
        f.add(new Button("6"));

        f.setVisible(true);

    }

}

grid


5. CardLayout

  • 여러 화면을 슬라이드처럼 바꿔가며 보여줄 수 있다
  • 여러 컨테이너를 추가한 다음, 순서대로 또는 임의대로 컨테이너를 선택해 보여줄 수 있다
  • 설치프로그램과 같이 단계별로 화면이동하는 경우에 사용
  • 생성자
    • CardLayout(int hgap, int vgap)
package com.awt.day2;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CartLayoutTest {

    public static void main(String[] args) {
        Frame f = new Frame("CardLayout");
        CardLayout cardLayout = new CardLayout(10,10);
        f.setLayout(cardLayout);

        Panel p1 = new Panel();
        p1.setBackground(Color.green);
        p1.add(new Label("Card 1"));

        Panel p2 = new Panel();
        p2.setBackground(Color.orange);
        p2.add(new Label("Card 2"));

        Panel p3 = new Panel();
        p3.setBackground(Color.cyan);
        p3.add(new Label("Card 3"));

        f.add(p1,"1");
        f.add(p2,"2");
        f.add(p3,"3");

        class Handler extends MouseAdapter{

            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getModifiers()==e.BUTTON3_MASK) { 
                    cardLayout.previous(f); //우클릭시 이전으로
                }else {
                    cardLayout.next(f); //좌클릭이나 휠 클릭 시 다음으로
                }
            }

        }
        p1.addMouseListener(new Handler());
        p2.addMouseListener(new Handler());
        p3.addMouseListener(new Handler());

        f.setSize(200,200);
        f.setVisible(true);

        //show(Container parent, String name)
        cardLayout.show(f, "1"); //frame에 추가된 컴포넌트 중 이름이 "1"인 것을 보여준다
    }
}

c1
c2
c3


6. Inset

  • 프레임이나 판넬의 레이아웃은 가장자리 여백이 없다
  • 그리드 레이아웃등의 간격을 주어도 안쪽 여백만 생기며, 가장자리는 여백이 생기지 않는다
  • Frame이나 Panel 클래스를 상속받는 사용자정의 클래스 생성
    • getInsets() 메서드를 오버라이딩 하여 가장자리 여백 설정
package com.awt.day2;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Panel;

class PracPanel extends Panel{

    @Override
    public Insets getInsets() {
        // TODO Auto-generated method stub
        return new Insets(15,15,15,15);
    }

}
class PracGrid extends Frame{
    public PracGrid(){
        super();
    }
    public Insets getInsets() {
        // TODO Auto-generated method stub
        return new Insets(30,45,30,45);
    }
}

public class insets{


    public static void main(String[] args) {
        PracGrid f = new PracGrid();
        f.setSize(400,400);
        PracPanel p1 = new PracPanel();
        p1.setBackground(Color.pink);
        f.add(p1,"Center");
        PracPanel p2 = new PracPanel();
        p2.setBackground(Color.cyan);
        f.add(p2,"East");
        p1.setLayout(new GridLayout(2,2,15,15));
        p2.setLayout(new GridLayout(1,2,15,15));

        Button bt1 = new Button("버튼1");    
        Button bt2 = new Button("버튼2");    
        Button bt3 = new Button("버튼3");    
        Button bt4 = new Button("버튼4");    
        Button bt5 = new Button("버튼5");    
        Button bt6 = new Button("버튼6");    

        p1.add(bt1);
        p1.add(bt2);
        p1.add(bt3);
        p1.add(bt4);
        p2.add(bt5);
        p2.add(bt6);

        f.setVisible(true);

    }

}

inset


활용

Border, Grid 이용

package com.awt.day2;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;

public class Calc {

    public static void main(String[] args) {
        Frame f = new Frame("계산기");
        TextField tf = new TextField("0");
        tf.setEditable(false);

        f.setSize(300,200);
        f.add(tf,"North");

        Panel plNum = new Panel();
        String[] numArr = {
                "7","8","9","/","CE",
                "4","5","6","*","BS",
                "1","2","3","-","1/x",
                "0","+/-",".","+","="
        };
        Button[] btNums = new Button[numArr.length];
        plNum.setLayout(new GridLayout(4,5,4,4));
        plNum.setBackground(Color.LIGHT_GRAY);
        f.add(plNum,"Center");

        for(int i=0; i<numArr.length; i++) {
            btNums[i] = new Button(numArr[i]);
            btNums[i].setForeground(Color.blue);
            plNum.add(btNums[i]);
        }
        f.setResizable(false);
        f.setVisible(true);
    }

}

calc

728x90
반응형