본문 바로가기
국비학원/수업기록

국비 지원 개발자 과정_Day12

by 루팽 2022. 12. 13.

이벤트 처리 순서

1. 이벤트 소스(버튼, 체크박스, 텍스트 필드)에 대응하는 인터페이스를 찾아라

추상메소드를 찾아서 재정의해야 한다

 

2. 이벤트 소스와 이벤트 처리를 담당하는 핸들러 클래스를 매칭

버튼.addActionListener(this); //this를 쓸 땐 항상 implements가 있어야 함(implements 이벤트 리스너)

 

3. actionPerformed메소드 오버 라이딩하기(재정의)

구현체 클래스가 있어야 한다.

ActionListener ←인터페이스이다.

구현체 클래스가 있어야 인스턴스화가 가능하다.

package dev_java.week3;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.Vector;

public class AddressBook_2 implements ActionListener {
  // 선언부
  // 이미지 경로 선언
  String imgPath = "D:\\\\vscode_java\\\\dev_java\\\\app\\\\src\\\\main\\\\java\\\\dev_java\\\\images\\\\address\\\\";
  // 툴바 및 타이틀 이미지 설정
  ImageIcon titlIcon = new ImageIcon(imgPath + "memo.png");
  JToolBar jtb = new JToolBar();
  // JFrame 생성
  JFrame jf_addr = new JFrame();
  // 메뉴바 구성하기
  JMenuBar jmb = new JMenuBar();
  JMenu jm_file = new JMenu("File");
  JMenuItem jmi_db = new JMenuItem("DB연동확인");
  JMenuItem jmi_all = new JMenuItem("전체조회");
  JSeparator js_exit = new JSeparator(); // 메뉴 분리선
  JMenuItem jmi_exit = new JMenuItem("종료");
  JMenu jm_edit = new JMenu("Edit");
  JMenuItem jmi_ins = new JMenuItem("입력");
  JMenuItem jmi_upd = new JMenuItem("수정");
  JMenuItem jmi_del = new JMenuItem("삭제");
  JMenuItem jmi_read = new JMenuItem("상세보기");
  // 버튼만들기
  JButton jbtn_ins = new JButton();
  JButton jbtn_upd = new JButton();
  JButton jbtn_del = new JButton();
  JButton jbtn_read = new JButton();
  // BorderLayout 중앙에 테이블(주소록 목록) 추가하기
  // JTable Header에 들어갈 문자열 선언
  String[] header = { "번호", "이름", "H.P" };
  // JTable은 양식만 제공할 뿐이고 데이터를 담을 클래스는 별도로 필요함
  String[][] datas = new String[3][3];
  // JTable에 들어갈 실제 데이터셋을 관리할 수 있는 클래스를 선언함
  // JTable에 보여지는 실제 데이터는 DefaultTableModel클래스를 통해 제어해야함을 의미
  DefaultTableModel dtm_addr = new DefaultTableModel(datas, header);
  // 데이터셋을 JTable 생성시 파라미터로 매칭하기
  JTable jtb_addr = new JTable(dtm_addr);
  // DefaultTableModel의 로우수가 많아지는 경우 스크롤바를 추가해야함
  // JScrollPane은 스크롤바를 품고있는 일종의 속지로 생각함
  // 첫번째 파라미터는 양식을 가진 JTable이고 두번째는 수직 스크롤바 정책, 세번쨰는 수평 스크롤바 정책을 정해줌
  JScrollPane jsp_addr = new JScrollPane(jtb_addr, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  AddressDialog_2 aDialog = new AddressDialog_2();

  // 생성자
  public AddressBook_2() {
    initDisplay();
  }

  // 화면그리기
  public void initDisplay() {
    jm_file.setMnemonic('F'); // F에 밑줄, alt F로 선택가능
    jm_edit.setMnemonic('E'); // E에 밑줄, alt E로 선택가능
    jbtn_ins.setIcon(new ImageIcon(imgPath + "new.gif"));
    jbtn_ins.setToolTipText("입력");
    jbtn_upd.setIcon(new ImageIcon(imgPath + "update.gif"));
    jbtn_upd.setToolTipText("수정");
    jbtn_del.setIcon(new ImageIcon(imgPath + "delete.gif"));
    jbtn_del.setToolTipText("삭제");
    jbtn_read.setIcon(new ImageIcon(imgPath + "detail.gif"));
    jbtn_read.setToolTipText("상세보기");

    // JPanel은 FlowLayout이 기본값인데 사용자 정의 크기와 위치를 위해
    // // 레이아웃을 뭉갠다.(null로 초기화 후 좌표값으로 조정)
    // jp_north.setLayout(null);
    // jbtn_all.setBounds(20, 20, 120, 30);
    // 기본 왼쪽정렬
    // jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
    // 버튼추가
    jtb.add(jbtn_ins);
    jtb.add(jbtn_upd);
    jtb.add(jbtn_del);
    jtb.add(jbtn_read);
    // 이벤트 소스와 이벤트 핸들러 클래스 매칭
    jmi_all.addActionListener(this);
    jmi_exit.addActionListener(this);
    jmi_ins.addActionListener(this);
    jmi_upd.addActionListener(this);
    jmi_read.addActionListener(this);
    jbtn_ins.addActionListener(this);
    jbtn_upd.addActionListener(this);
    jbtn_del.addActionListener(this);
    jbtn_read.addActionListener(this);
    // 창닫기 버튼 클릭시 종료처리
    jf_addr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // JFrame에 추가하기
    jf_addr.add("North", jtb);
    jf_addr.add("Center", jsp_addr);
    jf_addr.setTitle("주소록 ver 1.0");
    jmb.add(jm_file);
    jm_file.add(jmi_db);
    jm_file.add(jmi_all);
    jm_file.add(js_exit);
    jm_file.add(jmi_exit);
    jmb.add(jm_edit);
    jm_edit.add(jmi_ins);
    jm_edit.add(jmi_upd);
    jm_edit.add(jmi_del);
    jm_edit.add(jmi_read);
    jf_addr.setJMenuBar(jmb);
    jf_addr.setIconImage(titlIcon.getImage()); // AddressBook 팝업창 아이콘 바꾸기
    aDialog.jDg.setIconImage(titlIcon.getImage()); // AddressDialog 팝업창 아이콘 바꾸기
    jf_addr.setSize(500, 450);
    jf_addr.setVisible(true);
  }

  // 메인메소드
  public static void main(String[] args) {
    new AddressBook_2();
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    if (obj == jmi_all) { // 전체조회를 누를 경우
      String members[][] = {
          { "1", "이순신", "010-1111-2222" },
          { "2", "강감찬", "010-3333-4444" },
          { "3", "김춘추", "010-5555-6666" }
      };
      // 이미 테이블에 조회된 정보가 있는 경우 모두 삭제하고 그 뒤에 출력함
      while (dtm_addr.getRowCount() > 0) {
        dtm_addr.removeRow(0);
      }
      for (int i = 0; i < members.length; i++) {
        Vector<String> oneRow = new Vector<>(); // <>은 제네릭
        oneRow.add(members[i][0]);
        oneRow.add(members[i][1]);
        oneRow.add(members[i][2]);
        dtm_addr.addRow(oneRow);
      }
      // 익명 클래스 문법사용-자바 람다식, 자바스크립트 Arrow Function문법, 코틀린 문법과 유사
      // 스크롤바가 항상 아래있도록 설정
      jsp_addr.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
        public void adjustmentValueChanged(AdjustmentEvent e) {
          JScrollBar jsb = (JScrollBar) e.getSource();
          jsb.setValue(jsb.getMaximum());
        }
      });
    } else if (obj == jmi_exit) { // 종료
      // jf_addr.dispose(); // 그 창만 닫음
      System.exit(0); // 전부 다 닫음
    } else if (obj == jbtn_ins || obj == jmi_ins) { // 입력버튼을 누를 경우
      aDialog.setDialodg(jmi_ins.getText(), true);
    } else if (obj == jbtn_upd || obj == jmi_upd) { // 수정버튼을 누를 경우
      aDialog.setDialodg(jmi_upd.getText(), true);
    } else if (obj == jbtn_del || obj == jmi_del) { // 삭제버튼을 누를 경우

    } else if (obj == jbtn_read || obj == jmi_read) { // 상세보기버튼을 누를 경우
      aDialog.setDialodg(jmi_read.getText(), true);
    }
  }
}

 

package dev_java.week3;

import javax.swing.JDialog;

public class AddressDialog_2 {
  JDialog jDg = new JDialog();

  public AddressDialog_2() {
    initDisplay();
  }

  public void initDisplay() {
    jDg.setSize(400, 300);
    jDg.setVisible(false); // 상수
  }

  public void setDialodg(String title, boolean isView) { // 변수로 대체
    jDg.setTitle(title);
    jDg.setVisible(isView);
  }
}

 

git branch

git checkout 77aca8d(주소) >> HEAD를 해당 주소로 이동

git checkout -b tomato(이름) >> tomato 브랜치 생성

git switch master(이름) >> master로 바꿈

git merge tomato >> tomato를 master와 합침

git branch -d tomato >> tomato 브랜치 삭제

 

 

연습문제 풀이

package dev_java.week3.example;

class S1 {
  static int i; // 디폴트값 0, 전역변수(글로벌하게 사용 가능), static(인스턴스화 없이 사용 가능/복제본없이 원본만있음)

  static void m() {
  }
}

class S2 {
  void n() {
    S1.i = 500;
  }
}

public class StaticTest {
  public static void main(String[] args) {
    // insert here 전역변수 i를 초기화하시오.
    S1.i = 10;
    S1 s1 = new S1();
    s1.i = 100;
    System.out.println(S1.i); // 100
    System.out.println(s1.i); // 100, static이니까 복제본x(원본이 바뀐다)
    S2 s2 = new S2();
    // 메소드 이름 뒤에 세미콜론이면 메소드 호출
    s2.n(); // n메소드 호출
    System.out.println("n() 호출 후 ==> " + S1.i); // 500
  }
}

 

package dev_java.week3.example;

import java.util.Scanner;

// 접근제한자 private > friendly > protected > public
// static-변수 앞에, 메소드 앞에, 클래스 앞에
// final-변수 앞에(상수), 메소드 앞에(오버라이딩 불가), 클래스 앞에(상속 안됨, 자손 못가짐)
public class Exam1_1 {
  public static void main(String[] args) {
    double area = 0.0;
    final double PI = 3.14;
    // new 다음에 오는 클래스가 생성됨-이 때 생성자 호출됨(메소드처럼)
    Scanner s = new Scanner(System.in);
    System.out.print("첫번째 반지름을 입력하세요.");
    String user1 = s.nextLine();
    System.out.println("사용자가 입력한 첫번째 반지름: " + user1);
    System.out.print("두번째 반지름을 입력하세요.");
    String user2 = s.nextLine();
    System.out.println("사용자가 입력한 두번째 반지름: " + user2);
    int i1 = Integer.parseInt(user1); // 첫번째 반지름을 원시형 int로 저장 >int로 바꿔 연산해야하니까
    int i2 = Integer.parseInt(user2); // 두번째 반지름을 원시형 int로 저장
    area = i1 * i2 * PI; // int*int*double -> 결과는 double타입
    System.out.println("타원형의 면적은 " + area + " 입니다.");
    s.close();
  }
}

 

package dev_java.week3.example;

import java.util.Scanner;

public class Exam1_2 {
  double area; // 디폴트 0.0, 전역변수는 초기화를 생략할 수 있다(생성자가 대신해줌)
  final double PI = 3.14;

  // 자바에서는 같은 이름의 메소드를 중복선언할 수 있다
  // 단 파라미터의 개수가 다르거나 또는 타입이 달라야한다(메소드 오버로딩)
  double methodA() {
    return 0.0;
  }

  // 리턴타입 결정하기 -> 메인출력-리턴타입있음, double / 메소드출력-void
  // 파라미터의 개수와 타입 선택하기
  double methodA(int i1, int i2) {
    area = i1 * i2 * PI;
    return area;
  }

  public static void main(String[] args) {
    Exam1_2 e = new Exam1_2();

    Scanner s = new Scanner(System.in);
    System.out.print("첫번째 반지름을 입력하세요. ");
    String user1 = s.nextLine();
    System.out.println("사용자가 입력한 첫번째 반지름: " + user1);
    System.out.print("두번째 반지름을 입력하세요. ");
    String user2 = s.nextLine();
    System.out.println("사용자가 입력한 두번째 반지름: " + user2);
    int i1 = Integer.parseInt(user1);
    int i2 = Integer.parseInt(user2);
    s.close();

    e.methodA(i1, i2);
    System.out.println("타원형의 면적은 " + e.area + " 입니다.");
  }
}

댓글