- 자바는 컴포넌트 크기와 레이아웃을 만들기 위해 프로그래머가 메소드를 호출하는 것 대신에 레이아웃 관리자를 제공한다.
- 레이아웃 관리자는 각 객체가 화면에 출력될 위치에 관여할수 있지만 정확한 좌표를 지정할수는 없다. └ 브라우저에 기반한 GUI를 구성하기 때문에 └ GUI가 인터넷으로 전송되고 브라우저에서 실행된다면 화면 해상도, 크기 또는 그것을 실행할 브라우저의 종류에 구애받지 않는다. └ 메소드 호출과 switch문으로 처리하기 어려우므로 간단하게 하기 위해 (자바 디자이너들은) 레이아웃관리자를 제공하여 (관리자 하나, 혹은 조합으로) 사용자가 원하는 모양을 만들수 있도록 지원한다.
- java.awt패키지에 의해 제공되는 레이아웃 관리자는 스윙에서도 사용할 수 있다. └ 스윙 애플리케이션은 모든 레이아웃 관리자를 사용할 수 있다.
1. BorderLayout
Panel객체를 생성하고 거기에 GUI객체를 추가한다. 레이아웃 방법에 따라 일정한 영역에 패널을 위치시킨다. 패널은 한 개의 영역에서 시작하여 다른 영역에서 끝나도록 다른 색으로 지정할 수 있다. BorderLayout클래스는 각 영역의 크기를 자체적으로 정한다. 사용자는 간접적인 영향만 미친다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestBorderLayout extends Frame { TextField tfNorth; TextField tfCenter; TextField tfSouth; TextField tfEast; TextField tfWest; // Frame클래스의 기본 관리자 BorderLayout public TestBorderLayout() { tfNorth = new TextField("North"); //패널에 텍스트 필드 추가 tfCenter = new TextField("Center"); tfSouth = new TextField("South"); tfEast = new TextField("East"); tfWest = new TextField("West");
Panel pNorth = new Panel(); //각각의 텍스트 필드를 위한 패널 생성 pNorth.add(tfNorth); //패널에 텍스트 필드를 추가
Panel pCenter = new Panel(); pCenter.setBackground(Color.darkGray); //영역에 배경색 지정 pCenter.add(tfCenter);
Panel pSouth = new Panel(); pSouth.add(tfSouth);
Panel pEast = new Panel(); pEast.setBackground(Color.gray); pEast.add(tfEast);
Panel pWest = new Panel(); pWest.setBackground(Color.gray); pWest.add(tfWest);
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestBorderLayout tbl = new TestBorderLayout(); } }
class WinCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
2. FlowLayout
- 레이아웃 관리자중 가장 간단하다. - 컴포넌트가 프레임에 놓일때 왼쪽을 기준으로 위치한다. - 컴포넌트는 계속 이어지면서 위치하게 되고 해당 행에 출력되지 못하면 새로운 행을 만들어 출력한다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestFlowLayout extends Frame { TextField tfFirst; TextField tfSecond; TextField tfThird; TextField tfForth; TextField tfFifth;
public TestFlowLayout() { setLayout(new FlowLayout()); //Frame의 기본 레이아웃이 BorderLayout이기 때문에 레이아웃 관리자를 지정해주어야 한다. tfFirst = new TextField("First"); tfSecond = new TextField("Second"); tfThird = new TextField("Third"); tfForth = new TextField("Forth"); tfFifth = new TextField("Fifth"); //레이아웃 관리자가 선언된 다음 FlowLayout클래스는 컴포넌트 화면 배치를 처리한다. //왼쪽에서 오른쪽으로 펼쳐지면서 Frame에 객체를 위치시킬수 있다.
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestFlowLayout tfl = new TestFlowLayout(); } }
class WinCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
3. GridBagLayout
- 가장 강력하지만 레이아웃 관리자를 구현하는데 가장 복잡하다. - 다른 행과 열에 항목을 위치시키는 스프레드시트 프로그램처럼 동작하고 또 다르게 셀의 크기를 다르게 지정할수 있다. - 레이아웃 관리자의 복잡함을 처리하기 위한 클래스 GridBagConstraints를 호출한다. └ 프로그래머가 좌표, 범위, 스페이싱, 패딩을 지정할수 있게 해준다.
- 프레임에 놓인 모든 객체는 강제적으로 지정할 필요가 있다.
gridx : 열 위치 gridy : 행 위치 gridwidth : 셀 폭 gridheigth : 셀 높이 weightx : 여분 행 공간 할당 weighty : 여분 열 공간 할당 anchor : 셀에 컴포넌트를 정렬하는 방법 지정 fill : 컴포넌트를 채우는 방법 지정 insets : 컴포넌트와 셀의 가장자리 사이의 여백 지정 ipadx : x 방향의 여백 지정 ipady : y 방향의 여백 지정
gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, i, 0, 0);
gbl.setConstraints(answerLabel, gbc);
- 이 클래스는 레이아웃을 보다 정밀하게 제어하여 셀에 객체를 위치시킬수 있다.
- 어떤 이유로 높은 행과 열 번호를 지정해도 결과에서 행, 열에 공백이 없다. └ 만약 행, 열이 비어있다면 레이아웃 관리자에 의해 무시된다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestGridBagLayout extends Frame { TextField tfFirst; TextField tfSecond; TextField tfThird; TextField tfForth; TextField tfFifth;
GridBagConstraints gbc; //레이아웃에 사용되는 선택항목을 지정할 수 있는 객체 Button saveButton; Label answerLabel;
public TestGridBagLayout() { Insets i = new Insets(0,0,0,0);
saveButton = new Button("Save"); answerLabel = new Label("Answer");
tfFirst = new TextField("First"); tfSecond = new TextField("Second"); tfThird = new TextField("Third"); tfForth = new TextField("Forth"); tfFifth = new TextField("Fifth");
GridBagLayout gbl = new GridBagLayout(); //후에 사용하기 위한 이름 부여 setLayout(gbl); //레이아웃 설정
//프레임에 놓인 모든 객체를 강제적으로 지정 gbc = new GridBagConstraints(0,0,1,1,0.0,0.0, GridBagConstraints.EAST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(answerLabel, gbc);
gbc = new GridBagConstraints(1,0,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfFirst, gbc);
gbc = new GridBagConstraints(1,11,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfSecond, gbc);
gbc = new GridBagConstraints(1,8,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfThird, gbc);
gbc = new GridBagConstraints(2,0,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfForth, gbc);
gbc = new GridBagConstraints(2,1,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfFifth, gbc);
gbc = new GridBagConstraints(8,1,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(saveButton, gbc);
add(tfFirst); //프레임에 각 컴포넌트 추가 add(tfSecond); add(tfThird); add(tfForth); add(tfFifth); add(answerLabel); add(saveButton);
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestGridBagLayout tgbl = new TestGridBagLayout(); } }