Egloos 728x90

구글 애널리틱스


2009/01/05 14:17

[ Java ][ AWT ] GridBagLayout ▷ Java 복습



  GridBagLayout은 각 컴포넌트들의 위치와 크기를 좀 더 상세히 지정해 줄 수 있습니다. 덕분에 아주 보기 좋게 컴포넌트들을 배치해 줄 수 있죠. 개인적으로 생각하기에는 많이 쓰게 될 녀석인 것 같습니다.


/* GridBagLayout 예제
JavaStudy(http://www.javastudy.co.kr)
→자바 프로그래밍 강좌→Java Programming / 박용우
→제8장 AWT(http://www.javastudy.co.kr/docs/yopark/chap08/chap08.html)
→→ 4. 컨테이너와 레이아웃 관리자(Layout Manager)
→→→ 바. 그리드백 레이아웃 관리자(GridBagLayout)
*/

import java.awt.*;


public class GridBagLayoutTest extends Frame {

Label lblSmtpServer, lblMailFrom, lblRcptTo, lblSubject, lblBody;
TextField smtpServer, mailFrom, rcptTo, subject;
TextArea body;

GridBagLayout gbl;
GridBagConstraints gbc;


public GridBagLayoutTest() {

smtpServer = new TextField(40);
mailFrom = new TextField(40);
rcptTo = new TextField(40);
subject = new TextField(40);
body = new TextArea(5, 40);

lblSmtpServer = new Label("메일서버: ", Label.RIGHT);
lblMailFrom = new Label("From: ", Label.RIGHT);
lblRcptTo = new Label("To: ", Label.RIGHT);
lblSubject = new Label("제 목: ", Label.RIGHT);
lblBody = new Label("내 용: ", Label.RIGHT);

lblSmtpServer.setBackground(Color.ORANGE);
lblRcptTo.setBackground(Color.ORANGE);
lblBody.setBackground(Color.ORANGE);
lblMailFrom.setBackground(Color.YELLOW);
lblSubject.setBackground(Color.YELLOW);


gbl = new GridBagLayout();
setLayout(gbl); //GridBagLayout을 설정

gbc = new GridBagConstraints(); //☆GridBagLayout에 배치할 컴포넌트 위치 정보 등을 담을 객체 준비

gbc.fill = GridBagConstraints.BOTH; //GridBagConstraints.fill: 컴포넌트의 디스플레이 영역이 컴포넌트가 요청한 크기보다 클 때,
//크기설정을 다시 할 것인가를 결정합니다. GridBagConstraints 클래스는 다음과 같은 값을 가능한 값으로 제공해 주고 있습니다.
// ridBagConstraints.NONE: 디폴트 값
// GridBagConstraints.HORIZONTAL: 수평적으로 확장하고 수직적으로는 확장하지 않습니다.
// GridBagConstraints. VERTICAL: 수직적으로 확장하고 수평적으로는 확장하지 않습니다.
// GridBagConstraints.BOTH: 수평 및 수직으로 확장합니다.

gbc.weightx = 1.0;
gbc.weighty = 1.0;
//GridBagConstraints.weightx, GridBagConstraints.weighty: 컴포넌트의 디스플레이 영역이 컴포넌트가 요청한 크기보다 클 때
//남는 영역을 각 컴포넌트들에게 배분해 주어야 하는데, 이 때 컴포넌트가 차지할 너비(weightx)와 높이(weighty)에 대한 웨이트(weight)를
//나타냅니다. 이 너비와 높이에 대한 웨이트는 각 컴포넌트마다 달리 줄 수 있습니다.
//만약, 모든 컴포넌트의 너비와 높이에 대한 웨이트가 0이면, 디스플레이 영역이 커지더라도(사용자가 윈도우의 창을 키울 때)
//각 컴포넌트에 배당되는 영역이 없으므로 모든 컴포넌트들은 한군데 위치하게 되고 남는 영역은 그냥 빈공간으로 나타나게 됩니다.


gbAdd(lblSmtpServer, 0, 0, 1, 1);
gbAdd(smtpServer, 1, 0, 3, 1);
gbAdd(lblMailFrom, 0, 1, 1, 1);
gbAdd( mailFrom, 1, 1, 3, 1);
gbAdd(lblRcptTo, 0, 2, 1, 1);
gbAdd(rcptTo, 1, 2, 3, 1);
gbAdd(lblSubject, 0, 3, 1, 1);
gbAdd(subject, 1, 3, 3, 1);
gbAdd(lblBody, 0, 4, 1, 1);
gbAdd(body, 1, 4, 1, 1);
gbAdd(new Button("Send"), 0, 5, 2, 1);

pack(); // setSize(400, 300);

}


private void gbAdd(Component c, int x, int y, int w, int h) {

gbc.gridx = x;
gbc.gridy = y;
//가장 왼쪽 위 gridx, gridy값은 0
gbc.gridwidth = w; //넓이
gbc.gridheight = h; //높이
//gridwidth를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 행의 마지막 셀이되고,
//gridheight를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 열의 마지막 셀이됩니다.
//gridwidth를 GridBagConstraints. RELATIVE 값으로 설정하면 현재 행의 다음 셀부터 마지막 셀까지 차지하고,
//gridheight를 GridBagConstraints. RELATIVE 값으로 설정하면 현재 열의 다음 셀부터 마지막 셀까지 차지하도록 합니다.

gbl.setConstraints(c, gbc); //컴포넌트를 컴포넌트 위치+크기 정보에 따라 GridBagLayout에 배치

add(c);

}


public static void main(String args[]) {

GridBagLayoutTest f = new GridBagLayoutTest();

f.setTitle("GridBagLayout");
f.setVisible(true);

}

}

결과화면

  GridBagLayout에서 중요한 것이 GridBagConstraints입니다. 각 컴포넌트를 배치할 좌표와 크기정보를 GridBagConstraints에 지정해주기 때문에 때문이죠.. gridx와 gridy는 당연히 x,y좌표, gridwidth와 gridheight는 넓이와 높이에 해당하게 됩니다. 물론 x,y, 넓이, 높이라고 해도 우리가 일반적으로 말하는 것과는 비슷하면서도 다르지만요. 강좌에도 나와있던 얘기지만 GridBagLayout은 HTML의 테이블을 생각하며 구성하면 그나마 연상하기 쉽지 않을까 싶습니다.

  그런데 생각해보니 이 예제는 GridBagLayout의 특징을 제대로 알아보기 힘든 듯?



/* GridBagLayout 예제
JavaStudy(http://www.javastudy.co.kr)
→자바 프로그래밍 강좌→Java Programming / 박용우
→제8장 AWT(http://www.javastudy.co.kr/docs/yopark/chap08/chap08.html)
→→ 4. 컨테이너와 레이아웃 관리자(Layout Manager)
→→→ 바. 그리드백 레이아웃 관리자(GridBagLayout)
2번째 예제
*/

import java.awt.*;


class GridBagLayoutTest2 extends Frame {

public GridBagLayoutTest2() {

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setLayout(gridbag);

c.ipadx = 8;
c.ipadx = 8; //GridBagConstraints.ipadx, GridBagConstraints.ipady: 컴포넌트 너비의 최소값에 (ipadx * 2) 픽셀을 더하고,
//컴포넌트 높이의 최소값에 (ipady * 2) 픽셀을 더합니다
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;

makebutton("Btn1 fill=BOTH weight=1.0", gridbag, c);
makebutton("Btn2 fill=BOTH weight=1.0", gridbag, c);
makebutton("Btn3 fill=BOTH weight=1.0", gridbag, c);

c.gridwidth = GridBagConstraints.REMAINDER; //end row
//gridwidth를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 행의 마지막 셀이되고,
//gridheight를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 열의 마지막 셀이됩니다.
//gridwidth를 GridBagConstraints.RELATIVE 값으로 설정하면 현재 행의 다음 셀부터 마지막 셀까지 차지하고,
//gridheight를 GridBagConstraints.RELATIVE 값으로 설정하면 현재 열의 다음 셀부터 마지막 셀까지 차지하도록 합니다.
c.weightx = 0.5;
c.weighty = 0.5;

makebutton("Btn4 w=REMAINDER weight=0.5", gridbag, c);

c.fill = GridBagConstraints.BOTH;
c.weightx = 0.0;
c.weighty = 0.0; //reset to the default

makebutton("Btn5 fill=BOTH weight=0.0", gridbag, c); //another row

c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row

makebutton("Btn6 w=RELATIVE weight=0.0", gridbag, c);

c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.weightx = 0.75;
c.weighty = 0.75;

makebutton("Btn7 w=REMAINDER weight=0.75", gridbag, c);

c.gridwidth = 1; //reset to the default
c.gridheight = 2;
c.weightx = 0.25;
c.weighty = 0.25;

makebutton("Btn8 w=1 h=2 weight=0.25", gridbag, c);

c.weighty = 0.0; //reset to the default
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.gridheight = 1; //reset to the default

makebutton("Btn9 w=REMAINDER weighty=0.0 h=1", gridbag, c);
makebutton("Btn10 w=REMAINDER weighty=0.0 h=1", gridbag, c);

setSize(300, 300);

}



protected void makebutton(String name,
GridBagLayout gridbag,
GridBagConstraints c) {

Button button = new Button(name);

gridbag.setConstraints(button, c);

add(button);

}

public static void main(String args[]) {

GridBagLayoutTest2 f = new GridBagLayoutTest2();

f.pack();
f.setTitle("GridBagLayout2");
f.setVisible(true);

}

}



결과화면 2-1



결과화면 2-2. 창을 마우스로 끌어 크기를 변화시켰을 때

  2번째 소스는 솔직히 이해하기가 좀 어렵군요. 단지, height수치에 따라 창 크기를 변경했을 때 컴포넌트의 크기변화 정도와, gridwidth와 gridheight에 수치로 값을 주는 외에, REMAINDER나 RELATIVE 등을 값으로 줘서 공간을 차지하게 하는 것이 가능하다는 정도...?

  이 소스 역시 JAVA STUDY 박용우님의 강좌에 나와있던 것을, 개인적으로 보기 편하게 약간 수정하고 주석을 달았습니다.

덧글

댓글 입력 영역

애드센스336x280

알라딘TTB-Egloos(하단-일반)



이 이글루를 링크한 사람 (블랙)

36