[JAVA] GUI 공부하기 (2)

·2023년 10월 3일
0

JAVA

목록 보기
9/15

1. event 패키지

import java.awt.event.*;
로 호출할 수 있는 이벤트 패키지는 자바 gui 의 이벤트를 담당한다.
이벤트란? 내가 무언가 클릭하거나, 클릭하고 마우스를 떼거나, 움직였을 때 발생하도록 설정할 수 있는 코드이다. 진정한 gui 라고 볼 수 있다.

(1) MouseListner

MouseListener 인터페이스는 마우스 이벤트를 처리하기 위해 사용한다. 마우스 이벤트는 마우스의 상호 작용을 나타내며, MouseListener는 다섯 가지 메서드를 정의하고 있다. 상세 설명은 코드 아래에 작성했다.

import java.awt.*;
import java.awt.event.*;

class MyFrame01 extends Frame implements MouseListener{
	public MyFrame01(String title) {
		super(title);
		
		super.setSize(400, 300);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int xpos = (int)(screen.getWidth()/2 - this.getWidth()/2);
		int ypos = (int)(screen.getHeight()/2 - this.getHeight()/2);
		
		this.setLocation(xpos, ypos);
		this.setResizable(false);
		this.setVisible(true);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// 마우스를 클릭했을 때 호출
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// 마우스가 눌렸을 때 호출
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// 마우스를 떼었을 때 호출
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// 마우스 포인터가 해당 컴포넌트 안에 있을 때 호출
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// 마우스 포인터가 해당 컴포넌트 밖에 있을 때 호출
		
	}
}
public class Study_01 {
	public static void main(String[] args) {
		MyFrame01 frame = new MyFrame01("MouseListner");
	}
}

(2) MouseAdapter

그런데 이렇게 모든 메서드를 구현하면 필요없는 코드가 생긴다.
이런 경우 MouseAdapter 를 따로 상속받는 class 를 생성하여 사용할 수 있다.
이렇게 하면 불필요한 코드를 줄일 수 있고, 내가 원하는 기능만 사용할 수 있는 하나의 클래스가 생긴다.

import java.awt.*;
import java.awt.event.*;

class MyEvent02 extends MouseAdapter {
	@Override
	public void mouseReleased(MouseEvent e) {
		// 마우스 리스너를 구현함
		// 그래서 내가 필요한 것만 딱 골라서 사용할 수 있음
		System.exit(0);
	}
}

class MyFrame01 extends Frame {
	private Button bt = new Button("종료");
	
	public void init() {
		this.setLayout(new BorderLayout());
		this.add("South", bt);
		MyEvent02 event = new MyEvent02();
		bt.addMouseListener(event);
	}
	
	
	public MyFrame01(String title) {
		super(title);
		
		init();
		super.setSize(400, 300);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int xpos = (int)(screen.getWidth()/2 - this.getWidth()/2);
		int ypos = (int)(screen.getHeight()/2 - this.getHeight()/2);
		
		this.setLocation(xpos, ypos);
		this.setResizable(false);
		this.setVisible(true);
	}
}
public class Study_01 {
	public static void main(String[] args) {
		MyFrame01 frame = new MyFrame01("MouseListner");
	}
}

(3) ActionListener

ActionListner 은 actionPerformed 을 오버라이드 해 주어야 하는 인터페이스이다.
actionperformed 에 기능을 추가해 주고 버튼에 bt.addActionListener(this) 처럼 리스너 기능을 추가한다고 알려 주어야 한다.
개인적으로 이게 제일 쉽다

import java.awt.*;
import java.awt.event.*;


class MyFrame01 extends Frame implements ActionListener{
	private Button bt = new Button("종료");
	
	public void init() {
		this.setLayout(new BorderLayout());
		this.add("Center", bt);
		bt.addActionListener(this);

	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		System.exit(0);
		
	}
	
	public MyFrame01(String title) {
		super(title);
		
		init();
		super.setSize(400, 300);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int xpos = (int)(screen.getWidth()/2 - this.getWidth()/2);
		int ypos = (int)(screen.getHeight()/2 - this.getHeight()/2);
		
		this.setLocation(xpos, ypos);
		this.setResizable(false);
		this.setVisible(true);
	}
}


public class Study_01 {
	public static void main(String[] args) {
		MyFrame01 frame = new MyFrame01("MouseListner");
	}
}

예제

(1) ActionListener : 왼쪽, 오른쪽이 눌러졌습니다. // setText 메서드 활용

이제 actionListener로 여러가지 코드를 구현해 보며 익혀야 한다.
이쯤 되면 진도가 너무 안 나간다...
최근에 유튜브를 봤는데 블로그는 취업에도 자기 개발에도 딱히 도움이 안 된다고 한다. 왜냐하면 블로그 글 작성하는 것이 보통 하루를 통째로 잡아 먹는 경우가 많은데... (과정을 전부 캡처해야 하고 꼼꼼히 설명해야 하는 작업을 하면) 가성비가 나쁘다는 것이다.
하지만 나처럼 아직 자바 개념을 익히고 있는 사람에게는 블로그가 나쁘지 않은 것 같다.
왜냐하면 개념을 혼자 정리해 보며 꼼꼼히 익히고, 나중에 찾아볼 수 있도록 만들어 두는 dictionary 같기 때문이다.

자 이제 다음...

마우스로 왼쪽 버튼을 클릭하면 왼쪽 버튼이 눌러졌습니다, 라고 뜨고,
오른쪽 버튼을 클릭하면 오른쪽 버튼이 눌러졌습니다 라고 뜨는 코드를 짜 보자.

import java.awt.*;
import java.awt.event.*;


class MyFrame01 extends Frame implements ActionListener{
	
	private Button bt1 = new Button("왼쪽");
	private Button bt2 = new Button("오른쪽");
	private Label lb = new Label("버튼을 누르세요", Label.CENTER);
	private Panel p = new Panel();
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == bt1) {
			lb.setText("왼쪽 버튼이 눌러졌습니다");	// setText 메서드로 텍스트 삽입
		}else if (e.getSource() == bt2) {
			lb.setText("오른쪽 버튼이 눌러졌습니다");		
		}
	}
	
	public void init() {
		this.setLayout(new GridLayout(2,1));
		this.add(p);
		p.setLayout(new GridLayout(1,2));
		p.add(bt1);		bt1.addActionListener(this);	// 액션리스너 설정
		p.add(bt2);		bt2.addActionListener(this);
		lb.setFont(new Font("", Font.BOLD, 30));
		this.add(lb);
	}
	
	public MyFrame01(String title) {
		super(title);
		
		init();
        
		super.setSize(400, 300);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int xpos = (int)(screen.getWidth()/2 - this.getWidth()/2);
		int ypos = (int)(screen.getHeight()/2 - this.getHeight()/2);
		
		this.setLocation(xpos, ypos);
		this.setResizable(false);
		this.setVisible(true);
	}
}


public class Study_01 {
	public static void main(String[] args) {
		MyFrame01 frame = new MyFrame01("MouseListner");
	}
}

새로 알아갈 수 있는 메서드는 라벨에 setText("내용") 메서드로 내용을 바꾸어 볼 수 있다는 것.

(2) 다이어리 앱 만들기 : Calendar 사용하기

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class CalendarFrame extends Frame implements ActionListener {
	private int year, month; 		// year, month 를 저장해 줄 변수
	private Calendar calendar; 		// calendar 클래스의 객체를 만들어 표준 날짜와 시간을 내려받을 준비
	private Scanner in = new Scanner(System.in); 	// 스캐너로 ??
	private Label lb = new Label("", Label.CENTER);
	private Button bt1 = new Button("  ▲  "); 		// 상하 버튼 만들어 주기
	private Button bt2 = new Button("  ▼  ");
	private Panel north_p = new Panel();			// 달, 상하버튼 panel
	private Panel north_east_p = new Panel();		// 날짜 panel
	private Button bt[] = new Button[49];			// 각 날짜 button
	private Panel center_p = new Panel();			// 
	private String week_str = "일 월 화 수 목 금 토";		// 요일명을 string으로 만들어서 하나하나 끊어 배부해 줄 것
	
	private File dir = new File("D:\\nam\\2_JAVA\\JAVA_Study\\JumpToJava\\src");
	private File file = null;
	private int xpos, ypos;
	
	MyDialog mdl;
	
	class MyDialog extends Dialog {
		TextArea ta = new TextArea();
		Button yes_bt = new Button("저장");
		Button no_bt = new Button("취소");
		Panel p = new Panel();
		
		public MyDialog(Frame owner, String title, boolean modal) {
			super(owner, title, modal);
			this.setLayout(new BorderLayout());
			this.add("Center", ta);
			this.add("South", p);
			p.setLayout(new GridLayout(1,2));
			p.add(yes_bt);
			p.add(no_bt);
			this.setBounds(xpos-200, ypos, 200, 300);
			this.setResizable(false);
		}
		public void isVisible(boolean isVisible) {
			this.setVisible(isVisible);			// 켜져 있을 때만 보이게 만들기
		}
		
	}
	
	public void setDate() {
		// setDate 메서드
		// 무슨 기능? : 캘린더 클래스에서 표준 날짜를 받아와 알려준다 -> 이 경우에는 변수에 입히기
		calendar = Calendar.getInstance();
		year = calendar.get(Calendar.YEAR);	// 년도 가져오기
		month = calendar.get(Calendar.MONTH) + 1; // 월 가져오기 : 월은 0부터 시작해서 1 더해 줘야 한다
	}
	
	public void init() {
		this.setLayout(new BorderLayout());
		lb.setBackground(Color.gray);
		lb.setFont(new Font("", Font.BOLD, 30));
		this.add("North", north_p);
		north_p.setLayout(new BorderLayout());
		north_p.add("Center", lb);
		north_p.add("East", north_east_p);
		north_east_p.setLayout(new GridLayout(1,2));
		north_east_p.add(bt1);	bt1.addActionListener(this);
		north_east_p.add(bt2);	bt2.addActionListener(this);
		
		this.add("Center", center_p);
		center_p.setLayout(new GridLayout(7,7));
		String week[] = week_str.split(" ");
		int co = 0;
		for(int i=0; i<week.length; ++i) {
			bt[co] = new Button(week[i]);
			center_p.add(bt[co]);
			bt[co].setEnabled(false);
			co++;
		}
		for(int i=0; i<42; ++i) {
			bt[co] = new Button("");
			center_p.add(bt[co]);
			bt[co].addActionListener(this);
			co++;
		}
		mdl = new MyDialog(this, "", true); 
		mdl.yes_bt.addActionListener(this);
		mdl.no_bt.addActionListener(this);
		settingDate(false);//처음시작시 Down버튼이 눌러진것처럼 셋팅을 한다.
	}
	
	
	public void settingDate(boolean buttonUp) {
		// 매개 변수 값이 전달로 가는지, 다음 달로 가는지 정의
		// true 다음 날, false 전달
		if (buttonUp) {
			month++;
			if (month>11) {
				month = 0;
				year++;
			}
		}else {
			month--;
			if (month<0) {
				month = 11;
				year--;
			}
		}
		calendar.set(year, month, 1);
		int w = calendar.get(Calendar.DAY_OF_WEEK);
		int co = 7;
		int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		lb.setText(year + "년" + (month+1) + "월");
		for (int i = 1; i < w; ++i) {
			bt[co].setLabel("");
			bt[co].setEnabled(false);
			co++;
		}
		for (int i = 1; i <= lastDay; ++i) {
			bt[co].setLabel(String.valueOf(i));
			bt[co].setEnabled(true);
			co++;
		}
		for (int i = co; i < bt.length; ++i) {
			bt[i].setLabel("");
			bt[i].setEnabled(false);
		}
	}
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		if (arg0.getSource() == mdl.yes_bt) {
			try {
				FileWriter fw = new FileWriter(file);
				BufferedWriter bw = new BufferedWriter(fw);
				PrintWriter pw = new PrintWriter(bw);
				pw.println(mdl.ta.getText());
				pw.close();
				mdl.ta.setText("");
				mdl.isVisible(false);
			}catch(IOException ee) {}
		}else if (arg0.getSource() == mdl.no_bt) {
			mdl.ta.setText("");
			mdl.isVisible(false);
		}else if (arg0.getSource() == bt1) {
			settingDate(false);
		}else if (arg0.getSource() == bt2) {
			settingDate(true);
		}else {
			for (int i = 0; i<bt.length; ++i) {
				if (arg0.getSource() == bt[i]) {
					String filename = String.valueOf(year);
					if (month+1 > 9) {
						filename += month+1;
					}else {
						filename += "0" + (month + 1);
					}
					String day = bt[i].getActionCommand();		// 이벤트를 발생시킨 객체의 문자열을 가지고 온다.\
					if (day.length() == 2) {
						filename += day + ".txt";
					}else {
						filename += "0" + day + ".txt";
					}
					file = new File(dir, filename);
					try {
						if (!file.createNewFile()) {
							FileReader fr = new FileReader(file);
							BufferedReader br = new BufferedReader(fr);
							int count = 0;
							while(true) {
								String str = br.readLine();
								if (str == null) break;
								count++;
								if (count == 1) mdl.ta.setText(str + "\n");
								else mdl.ta.append(str + "\n");
							}
						}
						mdl.setTitle(filename);
						mdl.isVisible(true);
					}catch(IOException ee){}
					
				}
			}
		}
		
	}
	
	public CalendarFrame(String title) {
		super(title);
		
		super.setSize(400, 300);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		xpos = (int)(screen.getWidth()/2 - this.getWidth()/2);
		ypos = (int)(screen.getHeight()/2 - this.getHeight()/2);
		this.setLocation(xpos, ypos);
		this.setResizable(false);
		setDate();
		init();
		this.setVisible(true);

	}
}

public class Exam_01 {
    public static void main(String[] args) {
        CalendarFrame frame = new CalendarFrame("일기장");
    }
}


오류 잡느라 chatGPT 열심히 협박한 내용...
그런데 알고 보니까 폴더 설정을 없는 곳에다 만들어 둬서 그랬던 거였다
인간아...

profile
자바 백엔드 개발자 개인 위키

0개의 댓글

관련 채용 정보