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 |