자바(Java)/JAVA 2SE

그리드백(GridBag) 레이아웃

본클라쓰 2010. 7. 11. 17:25

 

 컴포넌트(Components)들을 격자 형식으로 배치하면서, 컴포넌트의 위치, 크기, 상대적인 크기의 비율 등에 관한 정보를 설정할 수 있다. 보통 GridBagLayout 클래스를 사용할 때 같이 사용되는 것이 GridBagConstraints 클래스 객체이다. GridBagConstraints 객체는 생성자와 필드(속성, 변수)로만 구성되어 있으며, GridBagLayout으로 설정된 컨테이너에 부착할 컨포넌트의 속성을 정의한다.  

 

 

[ 대표적인 GridBagConstraints 클래스 속성 ] 

int gridx : 컴포넌트가 위치할 격자의 위치 중 column을 나타냄(행)

int gridy : 컴포넌트가 위치할 격자의 위치 중 row를 나타냄(열)

 

int gridwidth : 컴포넌트가 가로로 몇 개의 셀을 차지 할 것인가를 나타냄

int gridheight : 컴포넌트가 세로로 몇 개의 쎌을 차지 할 것인가를 나타냄 

 

int weightx , int weighty : 다른 행, 열들과 비교하여 행과 열의 비를 결정함.

 

fill : fill변수는 컴포넌트가 셀 안에서 늘어나는 방향을 결정한다. default값은 NONE이다. 

GridBagConstraints.BOTH :  컴포넌트가 상하, 좌우 모두 늘어나게 한다.

GridBagConstraints.HORIZONTAL : 컴포넌트가 좌우로 늘어나게 한다.

GridBagConstraints.VERTICAL : 컴포넌트가 상하로 늘어나게 한다.  

GridBagConstraints.NONE : 컴포넌트가 최소의 크기로 보여짐 

  

GridBagLayout 클래스 생성자 

 GridBagLayout() : 레이아웃 매니저를 생성함 

 

GridBagLayout 클래스 주요 메소드

 setConstraints() : 컨테이너 제약을 설정

 addComponent() : 컴포넌트를 레이아웃에 추가

 maximumLayoutSize() : 컨테이너의 최대 크기를 반환

 minmumLayoutSize() : 컨테이너의 최소 크기를 반환 

 

[ 사용예제 ] 

/*
 * Subject : GridBagLayout 에 대한 예제
 * 작성일 : 2009. 01. 29
 * GridBagLayout과 GridBagConstraints에 대해 알아보기
 */

import java.awt.*;
import java.awt.event.*;

 

public class Simulator extends Frame {
 private Button b;
 private GridBagLayout gridbag_layout;
 private GridBagConstraints gridbag_con;
 
 public Simulator() {
  gridbag_layout = new GridBagLayout();
  setLayout(gridbag_layout);
  gridbag_con = new GridBagConstraints();  
  
  for ( int i = 0; i < 5; i++){
   for( int j = 0; j < 5; j++){
    String s = ""+i+","+""+j+"";
    b = new Button(s);
    gridbag_con.fill = GridBagConstraints.BOTH;
    addComponent(b, i, j, 1, 1, 0, 0);
   }
  } 
 }
 
 public void addComponent(Component c, int col, int row, int w, int h, int wx, int wy){
  /* set gridx and gridy */
  gridbag_con.gridx = col;
  gridbag_con.gridy = row;
  
  /* set gridwidth and gridheight */
  gridbag_con.gridwidth = w;
  gridbag_con.gridheight = h;
  
  gridbag_con.weightx = wx;
  gridbag_con.weighty = wx;
  
  /* set constrints */
  gridbag_layout.setConstraints(c, gridbag_con);
  add(c);  
 }
 
 public static void main(String[] args) {
  Simulator s = new Simulator();
  s.setTitle("GridBag_Test");
  s.setSize(300,200);
  
  s.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  
  s.show();
 }
}

 

[ 결 과 ] - addComponent(b, i, j, 1, 1, 1, 1); 일 경우 

 

addComponent(b, i, j, 1, 1, 0, 0); 일 경우 

 

 

※ TIP : GridBag 레이아웃은 분명 강력한 레이아웃이다. 하지만 GridBag 레이아웃을 사용하여 복잡한 레이아웃을 표현하기 보다는 표시 영역을 분할하는 패널을 몇 가지 배치하여 각 패널에 컴포넌트를 배치하는 것이 더 간단하고 정확할 때가 있다.