1. 레이아웃 메니저를 이용한 컴포넌트 배치
레이아웃 매니저는 컨테이너에 포함된 컴포넌트들의 배치(Layout)를 자동적으로 관리해주는 일을 한다. 컨테이너에 새로운 컴포넌트가 추가되거나 컨테이너의 크기가 변경되었을경우, 컨테이너에 포함된 컴포넌트들의 재배치를 레이아웃 매니저가 자동적으로 처리해주기 때문에 프로그래머가 컴포넌트의 재배치를 위한 코드를 작성하지 않아도 된다.
이처럼 컨테이너에 컴포넌트들을 효율적으로 배치하게 위해서는 레이아웃 매니저의 사용이 필수적이라고 할 수 있다.
자바에서는 5가지 종류의 레이아웃 매니저를 제공하며, 그 종류는 다음과 같다.
- BorderLayout
- FlowLayout
- GridLayout
- CardLayout
- GridbagLayout
컨테이너에는 단 하나의 레이아웃 매니저만을 설정할 수 있으며 모든 컨테이너는 따로 설정하지 않아도 기본적으로 레이아웃 매니저가 지정되어 있다.
각 컨테이너별 기본 레이아웃 매니저는 다음과 같다.
▶ 컨테이너별 기본 레이아웃 매니저
FlowLayout - Panel, Applet
BorderLayout - Window, Dialog, Frame
2. BorderLayout
BorderLayout은 컨테이너를 North, South, East, West, Center 모두 5개의 영역으로 나누고, 각 영역에 하나의 컴포넌트만을 배치 할 수 있도록 한다. 그래서 한 영역에 여러 개의 컴포넌트를 배치하면, 마지막에 추가한 컴포넌트만 보이게 된다.
한 영역에 하나 이상의 컴포넌트를 넣기 위해 Panel을 이용해야한다. Panel에 원하는 컴포넌트들을 넣은 다음, BorderLayout의 한 영역에 다시 이 Panel을 넣으면 된다.
BorderLayout은 컨테이너인 Window, Frame, Dialog의 기본 Layout이다. 즉, 이 컨테이너들의 레이아웃 매니저는 따로 설정하지 않아도 생성되어질 때부터 이미 BorderLayout으로 설정되어있다는것이다.
BorderLayout(int hgap, int vgap)
각 영역 사이에 간격이 있는 BorderLayout을 생성한다.
hgap - 각 영역의 사이에 간격을 준다(좌우)
vgap - 각 영역의 사이에 간격을 준다.(위아래)
BorderLayout()
영역 사이에 간격이 없는 BorderLayout을 생성한다.
add(String name, Component c) 또는 add(Component c, String name)
c - 추가하려는 컴포넌트
name - "North", "South", "East", "West", "Center"중에 하나 또는 BorderLayout.NORTH, BorderLayoutSOUTH, BorderLayout.EAST, BorderLayout.West, BorderLayout.CENTER 중의 하나
3. FlowLayout
FlowLayout은 컴포넌트들이 추가되는 순서에 따라 왼쪽에서 오른쪽으로 이어져나가며, 공간이 부족하면, 아랫줄에 추가된다.
이것은 마치 글자를 입력하면 왼쪽에서 오른쪽으로 진행해 나가며, 한 라인의 끝에 다다르면, 다음 라인의 처음부터 글자가 입력되는 워드프로세서에서 문자입력과 매우 유사하다.
또한 컴포넌트의 정렬에 있어서도 워드프로세서에서와 같이 왼쪽 정렬, 오른쪽 정렬, 그리고 가운데 정렬이 가능하다.
FlowLayout(int align, int hgap, int vgap)
align - 컴포넌트들의 정렬방법을 지칭한다.
FlowLayout.LEFT(왼쪽정렬), FlowLayout.CENTER(가운데정렬)
FlowLayout.RIGHT(오른쪽정렬) 중 하나를 지정한다.
hgap - 각 컴포넌트간의 사이에 간격을 준다.(좌우)
vgap - 각 컴포넌트간의 사이에 간격을 준다.(위아래)
FlowLayout(int align)
hgap과 vgap이 5픽셀인 FlowLayout을 생성한다.
align - 컴포넌트들의 정렬 방법을 지정한다.
FlowLayout()
가운데 정렬이면서 hgap과 vgap이 5픽셀이 FlowLayout을 생성한다.
Frame의 크기가 변경됨에 따라 컴포넌트 배치가 달라진다. 그 이유는 컨테이너의 Frame의 크기가 변해도, 포함된 컴포넌트들의 크기는 변하지 않는데, 레이아웃 매니저가 FlowLayout으로 설정된 컨테이너에 추가된 컴포넌트들은 컨테이너의 크기가 변해도 컴포넌트의 크기는 영향을 받지 않고 배치에만 영향을 받는다. 이때 컴포넌트들은 적절한크기(perferred size)를 유지하게 된다.
4. GridLayout
GridLayout은 컨테이너를 테이블처럼 행과 열로 나누어 컴포넌트를 배치한다. 여기에 추가되는 컴포넌트들은 모두 같은 크기로 나누어지며, 컨테이너의 크기를 변경하면 각 영역이 모두 같은 비율로 커지거나 작아지는 성질을 갖고 있다.
GridLayout(int row, int col, int hgap, int vgap)
영역들 간의 사이에 간격이 있는 GridLayout을 생성한다.
row - 컨테이너를 몇 개의 행(row)으로 나눌 것인지 적는다.
col - 컨테이너를 몇 개의 열(column)로 나눌 것인지 적는다.)
hgap - 각 영역간의 사이에 간격을 준다.(좌우)
vgap - 각 영역간의 사이에 간격을 준다.(위아래)
GridLayout(int row, int col)
영역들 간의 사이에 간격이 없는 GridLayout을 생성한다.
row - 컨테이너를 몇 개의 행(row)으로 나눌 것인지 적는다.
col - 컨테이너를 몇 개의 열(column)로 나눌 것인지 적는다.
5. CardLayout
CardLayout은 여러 화면을 슬라이드처럼 바꿔가며 보여줄 수 있다. 즉, 여러 개의 컨테이너를 CardLayout에 추가한 다음, 순서대로 또는 임의의 컨테이너를 선택해서 보여줄수 있다. 설치프로그램과 같이 단계별로 다른 화면으로 이동하는 경우에 사용하면 유용할 것이다.
CardLayout(int hgap, int vgap)
hgap - 컨테이너와 CardLayout사이에 간격을 준다.(수평)
vgap - 컨테이너와 cardLayout사이에 간격을 준다.(수직)
CardLayout()
컨테이너와 간격이 없는 CardLayout을 생성한다.
add(Container parent, String name)
name - 주어진 이름으로,
parent - 지정된 컨테이너에 추가한다.
show(Container parent, String name)
주어진 이름의 컴포넌트를 컨테이너를 보여준다.
name - 나타낼 컨테이너의 이름(추가할 때 사용한 이름)
parent - 컴포넌트가 보여질 컨테이너
first(Container parent)
parent - 지정된 컨테이너에 첫번째로 추가된 컴포넌트를 보여준다.
last(Container parent)
parent - 지정된 컨테이너에 마지막으로 추가된 컴포넌트를 보여준다.
previous(Container parent)
지정된 컨테이너에 현재 보여지고 있는 컴포넌트보다 이전에 추가된 것을 보여준다.(현재 보여지고 있는 것이 첫번째것이면, 제일 마지막 것이 나타나게 된다.)
next(Container parent)
지정된 컨테이너에 현재 보여지고 있는 컴포넌트보다 다음에 추가된 것을 보여준다.(현재 보여지고 있는 것이 마지막이면, 제일 첫번재 것이 나타나게 된다.)