• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

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

Java 정리 23

13 Dec 2018

Reading time ~4 minutes

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


숙제 복습

  • 12일자 숙제 클래스다이어그램 참고해서 재구현
    • Work class

01


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

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

메모장 구현

  • 클래스다이어그램과 mockup 이미지

02

03

  • awt를 이용한 design

04

  • 기본적인 새글, 열기, 저장, 다른 이름으로 저장, 닫기 이벤트처리 구현
    • JavaMemo class
    • JavaMemoEvt class

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를 생성
///////////////// 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
  • Dialog is-a 관계 예제
    • UseDialogIsA class
    • DialogIsA class

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

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

05

  • MemoFormat class
    ////////////////// 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
    ////////////////// 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


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와 거의 동일
// 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);
}
/**
* 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


숙제풀이

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

08

  • 클래스다이어그램

10

  • 숙제풀이
    • MemoHelp class
    • MemoHelpEvt class

09



Java