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

## Java 정리 23 - 메모장 구현, Dialog, Swing

---

### 숙제 복습

* 12일자 숙제 클래스다이어그램 참고해서 재구현
  * [Work class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181213/Work.java)

![01](/md/legacy-assets/java/23/01.webp)

---

### Event Handling에서 is-a, has-a 관계 정리

* **Event Handling에서 is-a 관계**
  * Event처리하는 클래스 **is a** Design 클래스
* **Event Handling에서 has-a 관계**
  * Event처리하는 클래스 **has a** Design 클래스

---

### 메모장 구현

* **클래스다이어그램과 mockup 이미지**
 
![02](/md/legacy-assets/java/23/02.webp)

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

* awt를 이용한 design

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

* 기본적인 새글, 열기, 저장, 다른 이름으로 저장, 닫기 이벤트처리 구현
  * [JavaMemo class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/view/JavaMemo.java)
  * [JavaMemoEvt class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/event/JavaMemoEvt.java)

---

### Dialog

* **정보를 제공하는 작은 Window**
  * **Window Component** : 사용자에게 보여주는 일
  * 기본 Layout : BorderLayout
* **부모 윈도우(owner)가 존재하는 Component**

* **Dialog has-a 관계**
  * **부모 has a 다이얼로그**
  * 부모가 Dialog 클래스를 갖는 구조
    * 부모창에서 Dialog 클래스를 바로 객체화 해서 다이얼로그 사용
* **Dialog is-a 관계**
  * **다이얼로그 자식 클래스 is a 다이얼로그**
    * 자식은 부모다.
    * **Dialog를 따로 상속받은 자식클래스로 다이얼로그 구현**
  * 다이얼로그자식클래스가 생성될 때 부모창의 주소를 넘겨받아 has-a 관계를 형성
    * 넘겨받은 부모창의 주소를 이용 Dialog자식클래스 생성자안에 부모클래스(Dialog)의 인자있는 생성자 호출하여 Dialog를 생성


```java
///////////////// has a /////////////////////////////////
// 1. 생성
// 반드시 부모 생성자(owner)가 존재
Dialog d = new Dialog(프레임, "타이틀", modal여부); 

// modal여부 true는 modal, false는 modaless
// 자식창이 동작시 부모창이 선택되지 않으면 modal, 부모창이 선택되면 modeless

// 2. 컴포넌트 배치
Button b = new Button("버튼");

d.add(b);
d.add(BorderLayout.CENTER, b);

// 3. 크기를 설정
d.setSize(width, height); 
d.setBounds(x, y, w, h);

// 4. 가시화
d.setVisible(true);

///////////////////// is a ////////////////////////////
// 1. Dialog 상속
public class Test extends Dialog { ... }

// 2. 생성자 정의하고 부모클래스의 생성자를 호출
public Test(Frame f) {
    super(f, "타이틀", modal여부);
    
    // Component 생성
    // Component Dialog 배치
    // Dialog에 크기설정
    // Dialog 가시화
}
```

* Dialog has-a 관계 예제
  * [UseDialogHasA class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181213/UseDialogHasA.java)
* Dialog is-a 관계 예제
  * [UseDialogIsA class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181213/UseDialogIsA.java)
  * [DialogIsA class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/date181213/DialogIsA.java)

---

### 메모장 서식 다이얼로그 추가

* List를 클릭하면 item의 값이 해당 List의 TextField에 설정
  * 보기가 변경되어야 된다.
* 확인 버튼이 클릭되면 설정한 Font의 정보가 부모창 TextArea에 반영이 되어야한다.
* 취소 버튼이 클릭되면 창이 닫혀야 한다.

![05](/md/legacy-assets/java/23/05.webp)

* [MemoFormat class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/view/MemoFormat.java)
```java
////////////////// MemoFormat class //////////////////////////////////
// TextArea의 Font를 가져와서 글꼴 TextField 초기값으로 설정하는 코드 ///
    String[] arrStyle = { "일반", "굵게", "기울임꼴", "굵은  기울임꼴" };
    for (String style : arrStyle) {
        listStyle.add(style);
    }
    // 부모창 JavaMemo T.A의 글꼴 정보를 가져와서 T.F에  설정한다.
    Font fontTa = jm.getTaNote().getFont();
    tfFont = new TextField(fontTa.getFamily());
    tfStyle = new TextField(arrStyle[fontTa.getStyle()]);
    tfSize = new  TextField(Integer.toString(fontTa.getSize()));
```

* [MemoFormatEvt class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/event/MemoFormatEvt.java)
```java
////////////////// MemoFormatEvt class /////////////////////
///////// 리스트 아이템 클릭했을 때 서식 변경하는 코드 ////////
    @Override
    public void itemStateChanged(ItemEvent ie) {
          
      // 선택되는 아이템의 값을 먼저 저장하고
      // 클릭되는 리스트와 관련있는 TextField에  할당해준다.
      String selectedValue =  ((List)ie.getSource()).getSelectedItem();
      Font lblPreviewFont = mf.getLblPreview().getFont(); // 기준
      String name = lblPreviewFont.getFamily();
      int style = lblPreviewFont.getStyle();
      int size = lblPreviewFont.getSize();
      
      // 선택한 아이템을 TextField의 값으로 설정
      // 미리보기 라벨을 변경시킴
      if (ie.getSource() == mf.getListFont()) {
        mf.getTfFont().setText(selectedValue);
        name = selectedValue;
      }
      if (ie.getSource() == mf.getListStyle()) {
        mf.getTfStyle().setText(selectedValue);
        style =  ((List)ie.getSource()).getSelectedIndex();
      }
      if (ie.getSource() == mf.getListSize()) {
        mf.getTfSize().setText(selectedValue);
        size = Integer.parseInt(selectedValue);
      }
      
      mf.getLblPreview().setFont(new Font(name, style,  size));
    }
...
    /**
    * MemoFormat 클래스의 미리보기 Label의 Font정보를
    * JavaMemo 클래스의 TextArea에 설정
    */
    public void setTaNoteFont() {
      mf.getJm().getTaNote().setFont(mf.getLblPreview().getFont());
      mf.dispose();
    }
```

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

---

### MVC 패턴


* **디자인, 업무처리(Business Logic), 데이터처리를 구분하여 만드는 개발 패턴**
  * **유지보수성이 좋아진다.**
  * 파일이 많아져 파일관리가 어렵다.
  * 값 넘기기가 어렵다.
  * 에러처리가 어렵다.
* **Model**
  * 데이터 처리
* **View**
  * 화면 디자인
* **Controller**
  * 이벤트 처리

---

### Swing

* **AWT 후속 Window Design**
  * AWT는 무겁고 느림, OS마다 다른 디자인 제공, 이미지를 다루기 어렵다. 
* **javax.swing 패키지**에서 Component 제공
  * javax는 자바 확장 패키지
* 장점
  * **빠르다**
  * **OS가 달라도 같은 디자인을 제공**
  * **이미지 기능 추가**
* AWT와 구분되는 이름을 가진다.
* 다양하고 미려한 Component.
* Event는 AWT의 Event를 같이 사용
* AWT Component를 Swing에서 같이 사용할 수 있다.
* **MVC pattern이 적용된 Component가 제공**
* 사용법은 AWT와 거의 동일

```java
// 1. Window Component를 상속
public class Test extends JFrame { ... }

// X를 누르면 인스턴스가 사라짐(다만 종료되지 않고 인스턴스는 살아있음)

// 2. 이벤트 처리와 관련있는 Component를 선언
JButton btn;

public Test() {
    super("타이틀명");
    // 3. 컴포넌트 생성 - AWT와 동일
    btn = new Button("버튼"); // JButton은 버튼에 Icon을 넣을 수 있다.

    // 4. 배치 - AWT와 동일
    // 5. 윈도우 사이즈 조정 - AWT와 동일
    // 6. 가시화 - AWT와 동일
    // 7. 윈도우 종료처리
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
```

```java
/**
* Swing을 사용한 Window Application
* @author owner
*/
public class HelloSwing extends JFrame implements ActionListener  {
     
  private JButton jb;
  private Button btn;
  public HelloSwing() {
    super("스윙 연습");
    
    // 컴포넌트 생성
    jb = new JButton("안녕! 난 스윙이라고 해");
    btn = new Button("AWT버튼");
    
    // 배치관리자 전환
    setLayout(new GridLayout(1, 2));
    
    // 배치
    add(jb);
    add(btn);
    
    jb.addActionListener(this);
    btn.addActionListener(this);
    
    // 크기설정
    setBounds(300, 200, 400, 400);
    // 가시화
    setVisible(true);
    
    // 윈도우 종료처리
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  public static void main(String[] args) {
      new HelloSwing();
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == jb) {
      dispose();
    }
    if (e.getSource() == btn) {
      btn.setLabel("AWT라니!!");
    }
  }
}
```

![07](/md/legacy-assets/java/23/07.webp)


---

### 숙제풀이

* 기존 작업하던 메모장에 기능추가
  * 메뉴아이템 메모장정보 선택시 다음과 같은 다이얼로그가 뜨도록 구현

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

* **클래스다이어그램**

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

* 숙제풀이
  * [MemoHelp class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/view/JavaMemo.java)
  * [MemoHelpEvt class](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/sistJavaStudy/src/kr/co/sist/memo/event/MemoHelpEvt.java)

![09](/md/legacy-assets/java/23/09.webp)
