GUI 를 이루는 기본 요소 네 가지는 각각 컴포넌트, 컨테이너, 레이아웃 관리자, 그리고 그래픽스라는 것을 처음에 언급한 바 있다. 우리는 이미 컴포넌트와 컨테이너에 대해 공부하였으며, 이제부터는 레이아웃 관리자 (Layout Manager) 에 대해 공부하도록 하자. 레이아웃(layout)이란 컴포넌트들을 컨테이너 상에 어떻게 배치할 것인지를 결정하는 것을 말한다.

많은 레이아웃 관리자가 있지만, 대표적인 것들로 다음의 다섯 가지를 들 수 있다.

  • BorderLayout - 동, 서, 남, 북, 중앙으로 배치
  • FlowLayout - 위에서 아래로, 왼쪽에서 오른쪽으로 배치
  • GridLayout - 동일 크기를 갖는 격자에 배치
  • GridBagLayout - 다른 크기를 가질 수 있는 격자에 배치
  • BoxLayout - 수평 또는 수직 방향으로 배치

우리는 이미 BorderLayout 과 FlowLayout 에 대해 어느 정도 공부한 바가 있다. BorderLayout 은 JFrame 에서, FlowLayout 은 JPanel 에서 각각 기본적으로 사용되었던 것을 기억할 것이다.

이미 배운 두 레이아웃을 간단히 정리해보고, GridLayout, GridBagLayout, 그리고 BoxLayout 에 대해 공부해보자. 




BorderLayout

BorderLayout은 컴포넌트를 동, 서, 남, 북, 중앙에 각각 배치하며, 각각의 위치에는 최대 한 개의 컴포넌트만 둘 수 있다. 만일 한 위치에 다수 개의 컴포넌트를 두려면 앞에서 배운 것처럼 해당 위치에 JPanel 을 두고, JPanel 상에 컴포넌트들을 배치하는 우회적 방법을 사용하면 된다.

컴포넌트들을 컨테이너 상에 위치하게 하려면 add() 메소드를 사용한다.

  • void add(Component c, int index)

처음 파라미터인 Component 는 우리가 여태까지 배운 라벨, 버튼, 텍스트필드 등 어느 컴포넌트든지 올 수 있고, 두번째 파라미터인 int 에는 EAST, WEST, SOUTH, NORTH, CENTER가 올 수 있다. 이 값들은 BorderLayout 에 포함되어 있으므로 BorderLayout.EAST 등과 같이 표기해야 한다.

BorderLayout 은 JFrame 에서 기본적으로 사용된다. 만일 JPanel 에서 BorderLayout 을 사용하려고 한다면 다음과 같이 setLayout() 메소드를 호출해야 한다.

BorderLayout layout = new BorderLayout();
setLayout(layout);

즉 BorderLayout 클래스의 인스턴스를 생성한 다음, 그것을 setLayout() 메소드의 파라미터로 넘겨주면 되는 것이다. setLayout() 은 Container 클래스가 가지고 있는 메소드이며, 따라서 그것의 하위 클래스인 JFrame, JPanel 등 임의의 컨테이너에서도 상속성에 따라 사용 가능하다.

다음 예제는 JPanel 상에 BorderLayout 을 설정하고, 동, 서, 남, 북, 중앙에 각각 "East", "West", "South", "North", "Center" 라는 라벨을 배치하는 것이다. 4번째 강의록, 즉 JLabel 에 대해 배울 때 이미 작성했던 프로그램이며, 단지 JFrame 대신 JPanel 상에 라벨을 배치했다는 점이 다르다.

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

public class Test {
 public static void main(String[] args) {
	MyFrame f = new MyFrame();
 }
}

class MyFrame extends JFrame {
 MyFrame() {
	setTitle("My Frame");
	setSize(300, 200);
	makeUI();
	setVisible(true);
 }
 private void makeUI() {
	/* create a panel and set the layout */
	JPanel p = new JPanel();
	p.setLayout(new BorderLayout());

	JLabel le, lw, ls, ln, lc;
	le = new JLabel("East");
	lw = new JLabel("West");
	ls = new JLabel("South");
	ln = new JLabel("North");
	lc = new JLabel("Center");

	le.setHorizontalAlignment(JLabel.CENTER);
	lw.setHorizontalAlignment(JLabel.CENTER);
	ls.setHorizontalAlignment(JLabel.CENTER);
	ln.setHorizontalAlignment(JLabel.CENTER);
	lc.setHorizontalAlignment(JLabel.CENTER);

	p.add(le, BorderLayout.EAST);
	p.add(lw, BorderLayout.WEST);
	p.add(ls, BorderLayout.SOUTH);
	p.add(ln, BorderLayout.NORTH);
	p.add(lc, BorderLayout.CENTER);

	/* attach panel to the frame */
	add(p, BorderLayout.CENTER);
 }
}


이 프로그램의 실행 결과는 아래와 같으며 4번째 강의록에서 소개한 결과와 동일함을 알 수 있다. 즉 우리는 기본적으로 FlowLayout 를 따르는 JPanel 에 대해 의도적으로 BorderLayout 을 사용하게 한 것이다.

 

'자바 > 자바팁' 카테고리의 다른 글

자바 날짜 관련 함수모음  (0) 2010.10.28
클래스패스 설정  (0) 2010.10.25
에코 클라이언트 과정  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
JFrame 관련 팁  (0) 2010.10.18

+ Recent posts