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 |