- [Java 기본]AWT, FlowLayout, GridLayout, BorderLayout

Posted by 겨울에
2011. 5. 14. 16:01 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/376


//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>
1. AWT
2. 기본 Window 생성
3. Component
4. FlowLayoutGridLayoutBorderLayout

<<참고>> 설명보다는 예제를 실행해 보세요.

//---------------------------------------------------------------------------//


1. Awt(Abstract Window Toolkit)
  1.1 Component(공통적인 부분들을 가지고 있다.) 
      - 전부 사각형으로 되어 자신만의 영역을 가지고 있다. 
         -> 오늘 과제 1Component 메소드들 한번 훌터 보기
    a) Frame
        - 사각형 테두리로서 X버튼과 화면 크게 하기 줄이기 버튼이 있는 것.
        - 일반 창
    b) Label
    c) Button
    d) Checkbox
    e) CheckboxGroup
    f) Choice
    g) List
    h) TextField
    i) TextArea
    j) MenuBar
    k) Menu
    l) MenuItem
    m) CheckboxMenuItem
    n) Dialog
    o) FileDialog

  1.2 Layout Manager   // 화면의 분할을 담당하는 Layout이다.
    a) FlowLayout
    b) GridLayout
    c) BorderLayout
    d) CardLayout
    e) GridBagLayout    // 가장 중요하고 많이 사용하는 것.

  1.3 Util
    a) Color    // 256*256*256 만큼의 색상 표현 가능
    b) Cursor 
    c) Dimension     // 크기(폭,높이)를 관리하는 클래스
    d) Toolkit       // 시스템과 관련된 정보를 얻어낼 수 있는 abstract 클래스 
    e) Image
    f) Font
    g) Panel   // 매우 중요
    h) ScrollPane

  1) 위의 모든 클래스는 java.awt package 에 속해 있는  클래스들 이다.
  2) 상속 : 위 클래스 들의 상속 관계
    Object  -> Conponent -> Container -> Window -> Frame
                   |
                    -> 모든 Components
  3) 위의 클래스는 java 1.2 이전의 버젼에서 나왔던 클래스들 이고, 그 이후에 나온 것은 javax.swing 이다.
     Frame 위의 모든 클래스 내용을 담을 수 있고, 사용할 수 있다.


  4) Java언어는 GUI를 처리하기 위해 만들었다가 Console부분은 나중에 추가 시켰다.
     그래서 Java언어는 GUI에 강한 언어이다.
     자바는 클라이언트 측면의 프로그램과 서버전용의 프로그램으로 구분 할 수 있다.
     우리는 클라이언트 측면의 프로그램을 배울 것이다.

2. GUI를 만드는 방법
  1) 객체를 이용한 Frame 을 만드는 방법
    a) import java.awt.*;   //import를 시켜야 한다.
    b) 객체를 발생 시켜야 한다.
      Frame f = new Frame();       //빈 Frame를 만든 것과 똑같다.
    c) 화면에 보여 주십시오 하는 메소드를 찾는다.
      setVisible(), view()
      f.setVisible(true); 화면에 보여 준다.
    

    d) Ex0115_01.java 참조

  2Frame 상속에 의한 방법
    a) import java.awt.*;   //import를 시켜야 한다.
    b) sub클래스를 만든다.
      class Ex0115_02_Sub extends Frame {

      }  // 내용이 아무 것도 없으면.. Frame와 Ex0115_02_Sub 클래스는 똑같다. // 그대로 상속 받았으므로

      public class Ex0115_02 {
        public static void main(String [] args) {
          Ex0115_2_Sub es = new Ex0115_02_Sub();  // 위의 Frame f = new Frame();와 동일 하다.
        }    // 한줄만 만들고, 나머지 내용은 Sub 클래스에 넣어서 하나의 모듈을 만들겠다는 의미이다.
      }

    c) Ex0115_02.java 참조.


3. Component
  3.1 Frame
    - 다른 컨퍼넌트를 얹어서 사용할 수 있는 장소이다.

      * Component 추가/삭제
      1) 추가 : 프레임객체.add(추가될 객체);
                프레임객체.add(위치, 추가될 객체);
                프레임객체.add(추가될객체, 위치);
      2) 삭제 : 프레임객체.remove(삭제될객체);
                    ^this   ^행동
  3.2 Label
      - 생성자 : Label lb = new Label();    //default 생성자 조그만 사각형
                 Label lb1 = new Label("Test");      // 디폴트로 왼쪽 치우침이 되어 있다.
                 Label lb2 = new Label("Test"Label.LEFT);       //자신만의 영역에 위치 지정 가능 RIGHT, LEFT, CENTER

//---------------------------------------------------------------------------//

4. 레이아웃 메니져를 이용한 화면 구성
  - 하나의 프레임이나 하나의 영역에는 하나의 레이아웃만 적용이 가능하다.
  - Ex0115_03.java 참조

  4.1 FlowLayout 메니져
    1) 생성자
      FlowLayout flow = new FlowLayout();
      FlowLayout flow = new FlowLayout(FlowLay.(RIGHT,CENTER,LEFT));    // default로 FlowLay.CENTER로 되어 있다.

     특징) 콤포넌트들의 크기를 default의 형태로 나타내 줄 수 있는 Layout이다.
           컴포넌트들의 위치가 지정되어 있지 않다. 정렬의 위치를 바꿀 수 있다.
           

     설정) this.setLayout(flow);        //플로우로 현재 프레임을 지정

  4.2 GridLayout
    1) 생성자
      GridLayout gl = new GridLayout();
                    = new GridLayout(intint);   //행과 열을 지정 가능
                    = new GridLayout(intintintint); // (행, 열, x축의 방향의 사이간격, y축 방향의 삽입 간격)

      주의사항 : 한영역에는 하나의 컴포넌트만 삽입이 가능하다.
                 행열을 (3,2)로 지정하면 현재 프레임의 높이 를 삼등분하고, 너비는 2등분하고,
                 똑같이 된다. 그리고 6개의 컴포넌트를 집어 넣을 수 있다.
                 그리고 들어가는 순서는 가로를 먼저 채우고 순서가 정해 진다.
                 그리고 들어간 컴포넌트는 들어간 위치 전체를 전부 자신의 영역으로 차지하게 된다. 

  4.3 Border Layout
    1) 생성자
      BorderLayout border = new BorderLayout();
      BorderLayout border = new BorderLayout(intint);  //(x축 사이의 간격, y축 사이의 간격)

    2) 방향 표시의 형태로 분할이 되어있다.
              North

   West       Center         East
          
              South
    3) add만 시키면.. Center에만 추가 시키도록 되어 있다.
      a) 위치를 지정해서 위치를 지정해서 삽입하는 방법을 사용한다.
         this.add("North",lb);
         this.add("West",lb2);
         this.add("South",lb1);
         -> 대소문자 주의해야 한다.
      b) this.add(lb, Border.NORTH); // 과 형태로 지정하는 방법도 있다.

//---------------------------------------------------------------------------//
// Ex0115_01.java
import java.awt.*;

public class Ex0115_01 {
    public static void main(String [] ar) {
      Frame f = new Frame();
        
        f.setSize(300,200); //300 * 200 size로 프래임의 크기를 지정해서 뛰운다.
        f.setVisible(true);
    }
}


//---------------------------------------------------------------------------//
// Ex0115_02.java : null Layout
import java.awt.*;

class Ex0115_02_Sub extends Frame {
    private Label lb  = new Label();
    private Label lb1 = new Label("Text1");
    private Label lb2 = new Label("Test2"Label.CENTER);
    private Color cc  = new Color(0,0,128); // Color cc = new Color(red, green, blue); 로 재정의 해서 사용할 수 있다.
    private Font f    = new Font("Sans-Serif"Font.BOLD15);     //Font("글자체",글자style(Font.BOLD, Font.ITALIC, Font.PLAIN), 글짜크기);
    
    public Ex0115_02_Sub(String str) {
        super(str);           // new Frame("Title"); 하면 자동으로 this.setTitle("Title"); 로 전달 된다.

        // this는 현재 프레임을 의미 한다.
        this.setLayout(null);    // default Layout 는 Board Layout이다. 이것을 null Layout로 셋팅을 하겠다.
        this.setBackground(cc);  // 배경색을 지정하겠다.(Color 클래스의 객체가 들어가야 한다.
        this.init();   //폼구성 Method
        this.setLocation(300250); // 좌표를 고정시키고 싶다.
        this.setResizable(false);// Size(크기)를 변환 못시키게 하겠다.
        //this.setTitle("Test");  // 타이틀을 변경하고 싶다.
        this.setSize(300,200);  //300 * 200 size로 프래임의 크기를 지정해서 뛰운다.
        this.setVisible(true);  //종료시키려면 DOS는 Ctrl+c 이고..
                                //setVisible은 항상 마지막에 와야 한다.
    }
    public void init() {  // 폼구성 메쏘드
                          //컴포넌트를 프레임에 올려 놓는 작업은 여기서 실행
        lb.setBounds(50505050);
        lb1.setBounds(501205050);    // setBounds(위치, 위치, 폭, 높이);
        lb2.setBounds(120505050);
        lb.setBackground(Color.gray);      //버튼 배경색.. 지정
        lb1.setBackground(Color.green);
        lb2.setBackground(new Color(255,255,255));
        lb1.setForeground(Color.yellow);   //글자색 지정

        lb2.setFont(f);    //폰트지정
        lb1.setFont(f);

        this.add(lb);
        this.add(lb1);
        this.add(lb2);
    }
}

public class Ex0115_02 {
  public static void main(String [] ar) {
      Ex0115_02_Sub es = new Ex0115_02_Sub("Title");
    }
}

//---------------------------------------------------------------------------//
// Ex0115_03.java : BorderLayout 연습
import java.awt.*;

class Ex0115_03_Sub extends Frame {
  private Label lb = new Label();
    private Label lb1 = new Label("Text1");
    private Label lb2 = new Label("Test2"Label.CENTER);
    private Color cc  = new Color(0,0,128); // Color cc = new Color(red, green, blue); 로 재정의 해서 사용할 수 있다.
    private Font f    = new Font("Sans-Serif"Font.BOLD15);     //Font("글자체",글자style(Font.BOLD, Font.ITALIC, Font.PLAIN), 글짜크기);
//    private FlowLayout flow = new FlowLayout();            //FlowLayout로 레이아웃 바꾸기
//    private GridLayout grid = new GridLayout(3, 1, 5, 5);  //GridLayout 레이아웃으로 바꾸기
    private BorderLayout border = new BorderLayout(5,5);
  
    public Ex0115_03_Sub(String str) {
        super(str);
        
        //this.setLayout(flow);      //FlowLayout 레이아웃 적용
        //this.setLayout(grid);        //GridLayout로 레이아웃 적용
        this.setLayout(border);
        
        this.setBackground(cc);  //배경색을 지정하겠다.(Color 클래스의 객체가 들어가야 한다.
        this.init();   //폼구성 Method
        this.setLocation(300250); // 좌표를 고정시키고 싶다.
        this.setResizable(true);// Size(크기)를 변환 못시키게 하겠다.
        //this.setTitle("Test");  // 타이틀을 변경하고 싶다.
        this.setSize(300,200);  //300 * 200 size로 프래임의 크기를 지정해서 뛰운다.
        this.setVisible(true);  //종료시키려면.. DOS는 Ctrl+c 이고..
                                //setVisible은 항상 마지막에 와야 한다.
    }

    public void init() {  // 폼구성 메쏘드
                          //컴포넌트를 프레임에 올려 놓는 작업은 여기서 실행
        lb.setBackground(Color.gray);      //버튼 배경색.. 지정
        lb1.setBackground(Color.green);
        lb2.setBackground(new Color(255,255,255));
        lb1.setForeground(Color.yellow);   //글자색 지정
        
        lb2.setFont(f);    //폰트지정
        lb1.setFont(f);
        
//    this.add("North", lb);     // BorderLayout 에서 위치 지정해서 레이아웃 하기...
//    this.add("South", lb1);
//    this.add("West", lb2);

        this.add(lb, BorderLayout.NORTH);     // BorderLayout 에서 위치 지정해서 레이아웃 하기...
        this.add(lb1, BorderLayout.SOUTH);
        this.add(lb2, BorderLayout.WEST);
    }
    
}

public class Ex0115_03 {
    public static void main(String [] ar) {
      Ex0115_03_Sub es = new Ex0115_03_Sub("Title");
    }
}


//---------------------------------------------------------------------------//
// Ex0115_04.java : Grid Layout 연습
import java.awt.*;

class Ex0115_04_Sub extends Frame {
    private Color cc = new Color(0,0,128); // Color cc = new Color(red, green, blue); 로 재정의 해서 사용할 수 있다.
    private GridLayout grid = new GridLayout(4355);  //GridLayout 레이아웃으로 바꾸기
    private Button[] bt = new Button[12];
    private String[] btname = new String[]{"*""0""#"};
  
    public Ex0115_04_Sub(String str) {
        super(str);

        this.setLayout(grid);
        this.setBackground(cc);  //배경색을 지정하겠다.(Color 클래스의 객체가 들어가야 한다.
        this.init();   //폼구성 Method
        this.setLocation(300250); // 좌표를 고정시키고 싶다.
        this.setResizable(true);// Size(크기)를 변환 못시키게 하겠다.
        //this.setTitle("Test");  // 타이틀을 변경하고 싶다.
        this.setSize(300,200);  //300 * 200 size로 프래임의 크기를 지정해서 뛰운다.
        this.setVisible(true);  //종료시키려면.. DOS는 Ctrl+c 이고..
                                //setVisible은 항상 마지막에 와야 한다.
    }
    public void init() {  // 폼구성 메쏘드
                          //컴포넌트를 프레임에 올려 놓는 작업은 여기서 실행
        for(int i=0; i < bt.length; i++) {
            if(i < 9) {
              bt[i] = new Button(String.valueOf(i+1));
            } else {
              bt[i] = new Button(String.valueOf(btname[i-9]));
            }
        }

        for(int i=0; i<bt.length; i++) {
            this.add(bt[i]);
        }
    }
}

public class Ex0115_04 {
    public static void main(String [] ar) {
        Ex0115_04_Sub es = new Ex0115_04_Sub("전화기");
    }
}

//===========================================================================//
// 과제 아래의 그림과 같이 만드세요.