이벤트 처리 순서
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 + " 입니다.");
}
}
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day14 (0) | 2022.12.15 |
---|---|
국비 지원 개발자 과정_Day13 (0) | 2022.12.14 |
국비 지원 개발자 과정_Day11 (1) | 2022.12.12 |
국비 지원 개발자 과정_Day10 (1) | 2022.12.09 |
국비 지원 개발자 과정_Day9 (1) | 2022.12.08 |
댓글