• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java 정리 20

10 Dec 2018

Reading time ~7 minutes

Java 정리 20 - AWT LayoutManager, Menu, 색변경


LayoutManager

  • 자동배치
    • BorderLayout, FlowLayout, GridLayout, GridBagLayout, CardLayout
    • 사용상의 편의성
      • 개발자가 원하는 위치에 컴포넌트를 배치할 수 없음.
  • 수동배치
    • Component를 개발자가 좌표를 설정하여 원하는 위치에 배치하는 것
      • 복잡한 디자인이 가능해진다.
        • 개발자가 크기, 위치를 설정하게 되므로 코드의 복잡도가 상승.

BorderLayout

  • Frame의 기본 레이아웃
  • 컴포넌트 고유크기가 무시되고 배치되는 영역의 크기만큼 커진다.
  • 하나의 영역에 하나의 컴포넌트만 배치된다.
  • 대표적인 BorderLayout 예는 메모장
// 일반 Component와 LayoutManager의 사용
// 1. Window Component를 상속(사용자에게 보여지는 일)
@SuppressWarnings("serial")
public class UseBorderLayout extends Frame {
  public UseBorderLayout() {
    super("BorderLayout 연습");
    // 2. 사용할 일반 컴포넌트를 생성
    TextField tfNorth = new TextField("North");
    Label lblEast = new Label("East");
    TextArea taCenter = new TextArea("Center");
    Label lblWest = new Label("West");
    Choice choSouth = new Choice();
    choSouth.add("South");
    
    // 3. 배치관리자 설정
    // Window Component인 Frame이나 Dialog는 BoarderLayout이 기본 설정  
    setLayout(new BorderLayout());
    
    // 4.컴포넌트의 배치관리자를 사용하여 배치
    // add("배치위치", 컴포넌트); add(상수, 컴포넌트);
    // add(컴포넌트, 상수); ..

    // 문자열 상수를 사용하여 배치
    add("North", tfNorth);
    // Center만 배치하면 테두리(동서남북)는 사라진다.
    add("Center", taCenter);

    // Constant( Field )를 사용하여 배치
    add(BorderLayout.EAST, lblEast);
    add(BorderLayout.WEST, lblWest);
    add(BorderLayout.SOUTH, choSouth);
    
    // 5. 윈도우 크기 설정
    setSize(400, 400);
    
    // 6. 사용자에게 보여주기(가시화)
    setVisible(true);
    
    // 종료
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent we) {
        dispose();
      }
    });
  }
  
  public static void main(String[] args) {
    new UseBorderLayout();
  }
}

01


FlowLayout

  • Container Component의 기본 Layout
    • Panel
  • 컴포넌트가 배치하는 순서대로 배치된다.
  • 컴포넌트의 고유 크기로 배치된다.
  • 윈도우의 크기가 변경되면 컴포넌트의 위치가 변경된다.
  • 대표적인 예는 탐색기
// FlowLayout과 Component의 사용
// 1. Window Component 상속
@SuppressWarnings("serial")
public class UseFlowLayout extends Frame {
  public UseFlowLayout() {
    super("FlowLayout 연습");
    
    // 2. 일반 컴포넌트 생성
    Label lblName = new Label("이름");
    TextField tfName = new TextField(10);
    Button btn = new Button("입력");
    List list = new List();
    
    list.add("정택성");
    list.add("이재현");
    list.add("김정운");
    list.add("김정윤");
    list.add("이재찬");
    
    Checkbox cb1 = new Checkbox("등산", false);
    Checkbox cb2 = new Checkbox("댄스", false);
    Checkbox cb3 = new Checkbox("게임", false);
    
    // CheckboxGroup을 설정하면 Radiobutton이  생성된다.
    CheckboxGroup cg = new CheckboxGroup();
    Checkbox rb1 = new Checkbox("남자", true, cg);
    Checkbox rb2 = new Checkbox("여자", false, cg);
    
    // 3. Layout 변경 : BorderLayout -> FlowLayout
    setLayout(new FlowLayout());
    
    // 4. 일반 컴포넌트 배치
    add(lblName); add(tfName); add(btn); add(list);
    add(cb1); add(cb2);add(cb3); add(rb1);add(rb2);
    
    // 5. 윈도우 크기 설정
    setSize(400, 300);
    
    // 6. 사용자에게 보여주기
    setVisible(true);
    
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        dispose();
      }
    });
  }
  public static void main(String[] args) {
    new UseFlowLayout();
  }
}

02

03


GridLayout

  • 격자 레이아웃
  • 행과 열로 구성되는 레이아웃
  • 모든 행에서 열의 크기가 동일
    • 배치되는 컴포넌트의 크기가 동일
  • 배치되는 컴포넌트의 수가 설정한 행, 열과 맞지 않으면 설정이 변경되어 컴포넌트가 배치됨

04

setLayout(new GridLayout(행의수, 열의수));
/**
* GridLayout<br/>
* 행과 열로 구성되며 모든 컴포넌트의 크기가 동일해야할  때.
*/
// 1. 윈도우 컴포넌트 상속
@SuppressWarnings("serial")
public class UseGridLayout extends Frame {
  public UseGridLayout() {
    super("GridLayout 연습");
    
    // 2. 컴포넌트 생성
    Button btn1 = new Button("btn1");
    Button btn2 = new Button("btn2");
    Button btn3 = new Button("btn3");
    Button btn4 = new Button("btn4");
    Button btn5 = new Button("btn5");
    Button btn6 = new Button("btn6");
    Button btn7 = new Button("btn7");
    Button btn8 = new Button("btn8");
    Button btn9 = new Button("btn9");
    
    // 3. 배치관리자 설정 : BorderLayout ->  GridLayout
    setLayout(new GridLayout(4, 2));

    // 4. 배치
    add(btn1); add(btn2); add(btn3); add(btn4);
    add(btn5); add(btn6); add(btn7); add(btn8);  add(btn9);
    
    // 5. 윈도우 크기 설정
    setSize(300, 400);
    
    // 6. 사용자에게 보여주기
    setVisible(true);
    
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent we) {
        dispose();
      }
    });
  }
  public static void main(String[] args) {
    new UseGridLayout();
  }
}

05


GridBagLayout

  • 행마다 열의 개수 크기가 다른 Layout

CardLayout

  • Container Component에만 설정할 수 있는 Layout
  • 한정적인 공간에서 여러 Panel을 교차하여 보여줄 때

수동배치

  • Component를 개발자가 좌표를 설정하여 원하는 위치에 배치하는 것
  • 복잡한 디자인이 가능해진다.
    • 개발자가 크기, 위치를 설정하게 되므로 코드의 복잡도가 상승.
  • 배치관리자를 해제한 후 배치를 시작한다.
  • 컴포넌트의 좌표설정 (배치되는 위치 설정)
    • Component 클래스의 setLocation() 사용
    • 모든 자식은 이 기능을 쓸 수 있음
  • 컴포넌트의 크기설정
    • Component 클래스의 setSize() 사용
  • setBounds로 컴포넌트의 크기, 위치를 한번에 설정가능
    • 많이들 둘 중 하나를 빼먹어서 등장한 메소드
// 배치관리자를 해제한 후 배치를 시작
setLayout(null);

// 컴포넌트의 좌표설정(배치되는 위치)
setLocation(int x, int y)

// 컴포넌트의 크기 설정
setSize(int width, int height);

// 컴포넌트의 좌표, 크기 동시설정
setBound(int x, int y, int width, int height);

06

/**
* 수동배치
* 개발자가 컴포넌트의 배치 위치와 크기를 설정하는  배치방법
*/
// 1. Window Component 상속
@SuppressWarnings("serial")
public class UseManualLayout extends Frame {
  public UseManualLayout() {
    super("수동배치");
    
    // 2. 컴포넌트 생성
    Label lbl = new Label();
    lbl.setText("라벨");
    TextField tf = new TextField();
    Button btn = new Button("클릭");      
    
    // 3. 배치관리자 설정(해제) : BorderLayout ->  null
    setLayout(null);
    
    // 4. 배치
    lbl.setLocation(10, 35); // 배치 좌표
    lbl.setSize(80,20);// 배치 크기
    // setLocation+setSize = setBounds
    tf.setBounds(50,100,120,25); // x, y, w, h
    btn.setBounds(250,200,120,23);
    
    add(lbl);
    add(tf);
    add(btn);
    
    /*
    // 5. 윈도우 좌표 설정
    setLocation(100, 200);
    // 6. 윈도우 크기 설정
    setSize(500, 600);
    */
    
    // 5,6을 동시에, 좌표, 크기를 동시설정하는  setBounds
    setBounds(200, 100, 400, 250);
    
    // 7. 사용자에게 보여주기(가시화)
    setVisible(true);
    
    // 종료처리
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        dispose();
      }
    });
    
    // 크기변경을 선택하는 메소드(false면 크기고정)
    setResizable(false);
  }
  public static void main(String[] args) {
    new UseManualLayout();
  }
}

07


여러 자동배치 같이 사용하기

  • Container Component
    • 일반 컴포넌트와 Container 컴포넌트를 저장할 수 있다.

08

// 일반 컴포넌트와 Container 컴포넌트를 저장할 수 있는
// 1. Window Component 상속
public class UsePanel extends Frame {
  public UsePanel() {
    super("Container Component 사용");
    
    // 2. 컴포넌트 생성
    // 이름부여방식 - 헝가리안 표기법(Hungarian  notation)
    Label lblName = new Label("이름");
    TextField tfName = new TextField(20);
    Button btnAdd = new Button("추가");
    Button btnClose = new Button("종료");
    TextArea taDisplay = new TextArea();
    
    // 일반컴포넌트를 배치할 수 있는 컨테이너  컴포넌트 생성
    Panel panelNorth = new Panel();
    
    // 생성된 컨테이너 컴포넌트에 일반 컴포넌트를  배치
    panelNorth.add(lblName);
    panelNorth.add(tfName);
    panelNorth.add(btnAdd);
    panelNorth.add(btnClose);
    
    // 3. 배치관리자 설정
    setLayout(new BorderLayout());
    
    // 4. 배치 BorderLayout의 특징
    // 하나의 영역에는 하나의 컴포넌트만 저장가능
    
    add(BorderLayout.NORTH, panelNorth);
    add(BorderLayout.CENTER, taDisplay);
    
    // 5. Window 위치,크기 설정
    setBounds(200, 150, 400, 250);
    
    // 6. 가시화
    setVisible(true);
    
    // 7. 종료처리
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        dispose();
      }
    });
  }
  public static void main(String[] args) {
    new UsePanel();
  }
}

09


Menu 만들기

  • MenuBar, Menu, MenuItem으로 구성

10

// 1. MenuBar 생성
MenuBar mb = new MenuBar();

// 2. Menu 생성
Menu m = new Menu("메뉴명");

// 3. MenuItem 생성
MenuItem mi = new MenuItem("메뉴아이템");

// 4. 생성된 메뉴아이템을 메뉴에 배치
m.add(메뉴아이템객체);

// MenuItem에 구분 가로선 추가, AWT에서사용가능한 두가지 방법
m.add("-"); 
m.addSeparator();
// Swing에선 m.addSeparator()만 사용가능

// 5. 메뉴를 메뉴바에 배치
mb.add(메뉴객체);

// 6. 메뉴바를 배치, Frame클래스의 setMenuBar 메소드 사용
setMenuBar(mb);
// Menu : MenuBar, Menu, MenuItem으로 구성
// Window Component 상속
public class UseMenuBar extends Frame {
  public UseMenuBar() {
    super("메뉴바 사용");
    
    // 1. MenuBar 생성
    MenuBar mb = new MenuBar();
    
    // 2. Menu 생성
    Menu m1 = new Menu("1조");
    Menu m2 = new Menu("2조");
    Menu m3 = new Menu("3조");
    Menu m4 = new Menu("4조");
    
    // 3. MenuItem 생성
    MenuItem mi1_1 = new MenuItem("이재찬");
    MenuItem mi1_2 = new MenuItem("이봉현");
    MenuItem mi1_3 = new MenuItem("박은영");
    MenuItem mi2_1 = new MenuItem("박영민");
    MenuItem mi2_2 = new MenuItem("김정윤");
    
    MenuItem mi3_1 = new MenuItem("김정운");
    
    MenuItem mi4_1 = new MenuItem("오영근");
    MenuItem mi4_2 = new MenuItem("박정미");
    MenuItem mi4_3 = new MenuItem("김건하");
    MenuItem mi4_4 = new MenuItem("공선의");
    MenuItem mi4_5 = new MenuItem("최혜원");
    
    // MenuItem을 Menu에 배치
    m1.add(mi1_1); m1.add(mi1_2); m1.addSeparator(); m1.add(mi1_3);
    m2.add(mi2_1); m2.add(mi2_2);
    m3.add(mi3_1);
    m4.add(mi4_1); m4.add(mi4_2); m4.add(mi4_3); 
    m4.addSeparator(); m4.add(mi4_4); m4.add(mi4_5);
    
    // Menu를 MenuBar에 배치
    mb.add(m1); mb.add(m2); mb.add(m3); mb.add(m4);
    
    // MenuBar를 Frame에 배치
    setMenuBar(mb);
    
    setBounds(200, 100, 800, 600);
    setVisible(true);
    
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        dispose();
      }
    });
  }
  
  public static void main(String[] args) {
    new UseMenuBar();
  }
}

11

  • 메뉴가 메뉴를 가지면 하위 메뉴를 가질 수 있다.
MenuItem mi3_1 = new MenuItem("김정운");
MenuItem mi3_2 = new MenuItem("이재현");
MenuItem mi3_3 = new MenuItem("노진경");
MenuItem mi3_4 = new MenuItem("최지우");
MenuItem mi3_5 = new MenuItem("노진경");

Menu m3 = new Menu("3조");
Menu m3_1 = new Menu("3조 group1");

m3.add(mi3_1);

// 메뉴(m3)가 메뉴(m3_1)을 가지면 하위 메뉴를  설정할 수 있다.
m3.add(m3_1);

// m3_1에 하위 메뉴 배치
m3_1.add(mi5663_2);
m3_1.add(mi3_3);
m3_1.add(mi3_4);
m3_1.add(mi3_5);

12


색변경

  • 전경색(foreground color)/ 배경색(background color)을 바꿀 수 있음
  • 바닥색(배경색) : 모든 컴포넌트 적용가능
    • Component클래스의 setBackground메소드 사용
    • Color클래스의 field를 사용하면 다양한 색을 설정할 수 없음
      • RGB 컬러는 필드값 또는 3개의 RGB정수값 또는 16진수색(0x00~0xF)으로 지정가능
// Color는 field member, RGB값(정수), 16진수 값으로 지정가능ㄴ
setBackground(Color.필드멤버);
setBackground(new Color(int r, int g, int b));
setBackground(new Color(0x16진수값);
  • 글자색(전경색) : 모든 컴포넌트 적용가능
setForeground(Color c);
setForeground(new Color(int r, int g, int b));
setForeground(new Color(0x16진수값);
  • 글꼴(FONT)
    • 글꼴(Font)은 라이센스 확인 꼭 하고 사용!
    • Font클래스 사용
      • 자바에서 제공하는 기본글꼴
        • DIALOG, DIALOG_INPUT, MONOSPACED, SERIF, SANS_SERIF
      • style
        • PLAIN, BOLD, ITALIC, BOLD ITALIC
// Font생성자
Font(String 글꼴, int style, int size);

// 글꼴을 설정하는 컴포넌트 클래스의 메서드
setFont(Font f);
setFont(new Font("글꼴", field명, 크기);

// BOLD|ITALIC 사용 예
taDisplay.setFont(new Font(Font.SERIF, Font.BOLD|Font.ITALIC, 20));

13

노답 색채감각..

숙제

  • 자동배치로 다음과 같은 레이아웃 만들기
    • 숙제풀이1

14

15

  • 수동배치로 다음과 같은 레이아웃 만들기
    • 숙제풀이2

16

17



Java