본문 바로가기
java/개념

배치관리자

by unhyepnhj 2024. 6. 28.

FlowLayout 배치관리자

 

배치 방법

- add() 메소드 이용

container.setLayout(new FlowLayout());
container.add(new JButton("add"));
container.add(new JButton("sub"));
container.add(new JButton("mul"));
container.add(new JButton("div"));
container.add(new JButton("Calculate"));

- FlowLayout 배치관리자는 컴포넌트를 왼쪽에서 오른쪽으로 배치

- 공간이 없으면 줄바꿈 후 다시 왼쪽에서 오른쪽으로 배치

프레임 윈도우 크기가 변경될 때 컴포넌트 위치 재설정

 

FlowLayout 생성자와 속성

align: 컴포넌트의 정렬 방법

- 왼쪽 정렬(FlowLayout.LEFT)

- 오른쪽 정렬(FlowLayout.RIGHT)

- 중앙 정렬(FlowLayout.CENTER): 디폴트

hGap: 좌우 컴포넌트 사이의 수평 간격(픽셀), 디폴트 5

vGap: 상하 컴포넌트 사이의 수직 간격(픽셀), 디폴트 5

new FlowLayout():	//기본 생성자이므로 디폴트값인 중앙 정렬, hGap=vGap=5
new FlowLayout(FlowLayout.LEFT);	//왼쪽 정렬, hGap=vGap=5
new FlowLayout(FlowLayout.LEFT, 10, 20);	//왼쪽 정렬, hGap=10, vGap=20

BorderLayout 배치관리자

 

배치 방법

- add() 메소드 사용

- add() 메소드에 컴포넌트 위치를 명확히 정해주어야 함

container.setLayout(new BorderLayout());
container.add(new JButton("div"), BorderLayout.WEST);
container.add(new JButton("Calculate"), BorderLayout.CENTER);

- BorderLayout 배치관리자는 컨테이너 공간을 동서남북+중간 5개의 영역으로 분할하여 배치

- 컨테이너의 크기가 변하면 새로운 크기에 맞도록 컴포넌트 크기 재조정(위 FlowLayout 예시와 동일)

 

- 일반적으로 5개의 컴포넌트만 붙일 수 있음

- 6개 이상의 컴포넌트를 부착하려면 한 영역에 JPanel 등 다른 컨테이너를 부착하고 이곳에 컴포넌트들을 부착

- CENTER에 컴포넌트가 부착될 때 다른 컴포넌트가 없으면 컨테이너 전체 크기로 배치

 

BorderLayout 생성자와 속성

hGap: 좌우 두 컴포넌트 사이의 수평 간격(픽셀), 디폴트 0

vGap: 상하 두 컴포넌트 사이의 수직 간격(픽셀), 디폴트 0

new BorderLayout();	//기본 생성자, hGap=vGap=0
new BorderLayout(30, 20);	//hGap=30, vGap=20

GridLayout 배치관리자

 

배치 방법

- add() 메소드

container.setLayout(new GridLayout(4,3));	//4*3 분할로 컴포넌트 배치
container.add(new JButton("1"));	//좌측 상단 첫 번째 셀에 버튼 배치
container.add(new JButton("2"));	//그 옆에 버튼 배치

- GridLayout 배치관리자는 컨테이너 공간을 격자로 분할하여 각 셀에 하나씩 컴포넌트 배치

 

GridLayout 생성자와 속성

rows: 행 수, 디폴트 1

cols: 열 수, 디폴트 1

hGap: 좌우 컴포넌트 사이의 수평 간격(픽셀), 디폴트 0

vGap: 상하 컴포넌트 사이의 수직 간격(픽셀), 디폴트 0

new GridLayout();	//기본 생성자, 1*1 그리드에 hGap=vGap=0으로 배치
new GridLayout(4, 3, 5, 5);	//4*3 그리드에 hGap=vGap=5로 배치

- 셀 수보다 많은 컴포넌트가 추가되면 생성자에 주어진 rows와 cols가 지켜지지 않음

- 모든 컴포넌트를 수용하도록 행과 열의 수가 적당히 변형


배치관리자 없는 컨테이너

- 모든 컨테이너는 배치관리자를 가짐

- 배치관리자가 컴포넌트의 위치와 크기를 결정하도록 하는 것이 자바 GUI의 기초

- 배치관리자는 컴포넌트를 절대적인 위치에 배치하지 않고, 다른 컴포넌트의 상대적인 위치에 배치

- 컨테이너의 크기가 변하면 컴포넌트의 크기도 함께 변화

 

배치관리자 없는 컨테이너가 필요한 경우

  • 컴포넌트의 크기나 위치를 개발자가 결정
  • 게임 프로그램과 같이 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우
  • 여러 컴포넌트들이 겹치는 효과를 연출하고자 하는 경우

 

컨테이너의 배치관리자 제거

container.setLayout(null);	//container의 배치관리자 제거

- Container 클래스의 setLayout() 메소드 사용

JPanel p = new JPanel();
p.setLayout(null);

- JPanel에 현재 부착된 배치관리자 삭제

- 연산 결과 컨테이너 p에 배치관리자가 존재하지 않으므로

- 부착되는 컴포넌트의 크기나 위치가 자동 조절되지 않음

- p에 삽입된 컴포넌트들은 모두 0*0 크기로 설정되어 보이지 않음

 

컴포넌트의 절대 위치와 절대 크기 설정

- 배치관리자가 없는 컨테이너에 컴포넌트를 삽입할 때는 응용프로그램에서 컴포넌트의 크기와 위치를 직접 설정

void setSize(int width, int height);	//컴포넌트를 width*height 크기로 설정
void setLocation(int x, int y);		//컴포넌트의 왼쪽 상단 모서리 좌표를 (x, y)로 설정
void setBounds(int x, int y, int width, int height);	//크기와 위치 동시 설정

- 컴포넌트의 절대 위치와 크기를 설정하기 위해 위 메소드 이용

Panel p = new JPanel();
p.setLayout(nulk);	//배치관리자 제거

JButton clickButton = new JButton("Click");
clickButton.setSize(100, 40);		//버튼 크기 100*40
clickButton.setLocation(50, 50);	//버튼 위치를 (50, 50)으로 지정
p.add(clickButton);			//패널에 버튼 부착

- 패널 내 (50, 50) 위치에 100*40 크기의 버튼 출력

 

- CardLayout을 제외한 나머지 배치관리자는 컴포넌트들이 서로 겹치지 않도록 배치

- 배치관리자가 없는 컨테이너를 만들면 컴포넌트들이 서로 겹치도록 배치 가능


예제 9-3 FlowLayout 배치관리자를 사용하여 스윙 응용프로그램 작성

- LEFT 정렬, hGap=30, vGap=40인 FlowLayout 배치관리자

- 5개의 버튼 컴포넌트 부착

import javax.swing.*;
import java.awt.*;

public class FlowLayoutEx extends JFrame{
	public FlowLayoutEx() {
		setTitle("FlowLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		//컨텐트팬에 FlowLayout 배치관리자 설정
		c.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
		//왼쪽 정렬, hGap=30, vGap=20
		c.add(new JButton("add"));
		c.add(new JButton("sub"));
		c.add(new JButton("mul"));
		c.add(new JButton("div"));
		c.add(new JButton("Calculate"));

		setSize(300,200);	//프레임 크기 300*200
		setVisible(true);
	}
	public static void main(String[] args) {
		new FlowLayoutEx();
	}
}

 

예제 9-4 BorderLayout 배치관리자를 사용하여 스윙 응용프로그램 작성

- hGap=30, vGap=20

- 5개의 버튼 컴포넌트 삽입

import javax.swing.*;
import java.awt.*;

public class BorderLayoutEx extends JFrame{
	public BorderLayoutEx() {
		setTitle("BorderLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		c.setLayout(new BorderLayout(30, 20));
		c.add(new JButton("Calculate"), BorderLayout.CENTER);
		c.add(new JButton("add"), BorderLayout.NORTH);
		c.add(new JButton("sub"), BorderLayout.SOUTH);
		c.add(new JButton("mul"), BorderLayout.EAST);
		c.add(new JButton("div"), BorderLayout.WEST);
		
		setSize(300, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new BorderLayoutEx();
	}
}

 

예제 9-5 GridLayout 배치관리자를 사용하여 스윙 응용프로그램 작성

- 콘텐트팬을 4*2로 분할

- JLabel 컴포넌트외 JTextField 컴포넌트 부착

- vGap=5

import javax.swing.*;
import java.awt.*;

public class GridLayoutEx extends JFrame{
	public GridLayoutEx() {
		setTitle("GridLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		GridLayout grid=new GridLayout(4, 2);	//4*2 분할
		grid.setVgap(5);	//vGap=5
		
		Container c=getContentPane();
		c.setLayout(grid);
		c.add(new JLabel(" 이름"));
		c.add(new JTextField(""));
		c.add(new JLabel(" 학번"));
		c.add(new JTextField(""));
		c.add(new JLabel(" 학과"));
		c.add(new JTextField(""));
		c.add(new JLabel(" 과목"));
		c.add(new JTextField(""));
		
		setSize(300, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new GridLayoutEx();
	}
}

 

예제 9-6 배치관리자 없는 컨테너에 컴포넌트를 절대 위치와 절대 크기로 지정

- 컨텐트팬 배치관리자를 삭제하고

- 9개의 버튼과 하나의 문자열 출력

- JLabel 컴포넌트를 이용해 200*20 크기의 문자열 출력하고 (130, 50)에 위치 고정

- 버튼 크기 50*20

import javax.swing.*;
import java.awt.*;

public class NullContainerEx extends JFrame {
	public NullContainerEx() {
		setTitle("Null Container Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(null);
		
		JLabel la=new JLabel("Hello, Press Buttons!");
		la.setLocation(130, 50);
		la.setSize(200, 20);
		c.add(la);
		
		for(int i=0; i<9; i++) {
			JButton b=new JButton(Integer.toString(i));
			b.setLocation(i*15, i*15);
			b.setSize(50, 20);
			c.add(b);
		}
		
		setSize(300, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new NullContainerEx();
	}
}

 

>>

'java > 개념' 카테고리의 다른 글

자바의 멀티스레딩  (0) 2024.11.19
멀티태스킹  (0) 2024.11.19
컨테이너와 배치  (0) 2024.06.28
스윙 GUI 프로그램 만들기  (0) 2024.06.27
자바 GUI 패키지  (0) 2024.06.27