---
title: "Java 정리 20"
date: "2018-12-10"
tags: ["Java"]
status: archived
verified: false
---

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

---

### LayoutManager

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

---

### BorderLayout

* **Frame의 기본 레이아웃**
* 컴포넌트 고유크기가 무시되고 **배치되는 영역의 크기만큼 커진다.**
* **하나의 영역에 하나의 컴포넌트만 배치**된다.
* 대표적인 BorderLayout 예는 **메모장**

```java
// 일반 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](/md/legacy-assets/java/20/01.webp)

---

### FlowLayout

* **Container Component의 기본 Layout**
  * **Panel**
* 컴포넌트가 **배치하는 순서대로 배치된다.**
* 컴포넌트의 **고유 크기**로 배치된다.
* **윈도우의 크기가 변경되면 컴포넌트의 위치가 변경**된다.
* 대표적인 예는 **탐색기**

```java
// 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](/md/legacy-assets/java/20/02.webp)

![03](/md/legacy-assets/java/20/03.webp)

---

### GridLayout

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

![04](/md/legacy-assets/java/20/04.webp)

```java
setLayout(new GridLayout(행의수, 열의수));
```

```java
/**
* 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](/md/legacy-assets/java/20/05.webp)

---

### GridBagLayout 

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

### CardLayout

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

---

### 수동배치

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

```java
// 배치관리자를 해제한 후 배치를 시작
setLayout(null);

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

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

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

![06](/md/legacy-assets/java/20/06.webp)

```java
/**
* 수동배치
* 개발자가 컴포넌트의 배치 위치와 크기를 설정하는  배치방법
*/
// 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](/md/legacy-assets/java/20/07.webp)

---

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

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

![08](/md/legacy-assets/java/20/08.webp)

```java
// 일반 컴포넌트와 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](/md/legacy-assets/java/20/09.webp)

---

### Menu 만들기

* **MenuBar, Menu, MenuItem**으로 구성

![10](/md/legacy-assets/java/20/10.webp)

```java
// 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);
```

```java
// 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](/md/legacy-assets/java/20/11.webp)

* 메뉴가 메뉴를 가지면 하위 메뉴를 가질 수 있다.

```java
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](/md/legacy-assets/java/20/12.webp)

---

### 색변경

* **전경색(foreground color)/ 배경색(background color)**을 바꿀 수 있음
* **바닥색(배경색) : 모든 컴포넌트 적용가능**
  * **Component**클래스의 **setBackground**메소드 사용
  * Color클래스의 field를 사용하면 다양한 색을 설정할 수 없음
      * RGB 컬러는 필드값 또는 3개의 RGB정수값 또는 16진수색(0x00~0xF)으로 지정가능

```java
// Color는 field member, RGB값(정수), 16진수 값으로 지정가능ㄴ
setBackground(Color.필드멤버);
setBackground(new Color(int r, int g, int b));
setBackground(new Color(0x16진수값);
```

* 글자색(전경색) : 모든 컴포넌트 적용가능

```java
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

```java
// 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](/md/legacy-assets/java/20/13.webp)
&lt;center>노답 색채감각..&lt;/center>

---

### 숙제

* 자동배치로 다음과 같은 레이아웃 만들기
  * [숙제풀이1](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181210/AutoLayout.java)

![14](/md/legacy-assets/java/20/14.webp)

![15](/md/legacy-assets/java/20/15.webp)

* 수동배치로 다음과 같은 레이아웃 만들기
  * [숙제풀이2](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181210/ManualLayout.java)

![16](/md/legacy-assets/java/20/16.webp)

![17](/md/legacy-assets/java/20/17.webp)
