본문 바로가기
Programming/JAVA

자바의 이벤트 처리

by 안녕주 2020. 12. 30.

명품자바프로그래밍 chapter10_lab9

실습1| GUI 작성

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class GuiTest extends JFrame{
	JPanel pw = new JPanel();
	JTextField pt1, pt2,pt3,pt4;
	JButton pb1, pb2;
	
	public GuiTest() {
		setTitle("Gui Test"); //창의 레이블
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X 눌렀을 때 닫히도록
		
		Container c = getContentPane(); //컨테이너 선언
		c.setLayout(new BorderLayout(10,10)); //컴포넌트 사이의 수평 수직 간격이 10,10 픽셀이 되도록 배치 관리자 설정
		MyListener ml = new MyListener(); //이벤트 선언
		
		pw.setLayout(new GridLayout(4,1)); // 4행 1열의 GRidLayout
		pw.add(new JLabel("이름")); 
		pw.add(new JLabel("학번"));
		pw.add(new JLabel("전공"));
		pw.add(new JLabel("연락처")); 
		c.add(pw,BorderLayout.WEST); //서쪽에
		 
		
		JPanel ptf = new JPanel(new GridLayout(4,1,0,10));
		pt1 = new JTextField(5); pt2 = new JTextField(5); pt3 = new JTextField(5); pt4 = new JTextField(5); //JTextField 선언
		ptf.add(pt1);ptf.add(pt2);ptf.add(pt3);ptf.add(pt4); //Panel에 추가
		pt1.addActionListener(ml);pt2.addActionListener(ml);pt3.addActionListener(ml);pt4.addActionListener(ml); //이벤트 추가
		c.add(ptf, BorderLayout.CENTER);  //pt1,2,3,4 가 들어 있는 ptf pannel의 위치는 Center
		
		JPanel jb = new JPanel(new FlowLayout()); //FlowLayout의 레이아웃(왼--> 오 )
		pb1 = new JButton("확인"); //확인 출력
		pb2 = new JButton("취소"); //취소 출력
		
		jb.add(pb1); jb.add(pb2); //Panel에 pb1 pb2 추가
		pb1.addActionListener(ml); pb2.addActionListener(ml); //이벤트 추가
		c.add(jb, BorderLayout.SOUTH); //남쪽에
		
		setSize(350,250); // 프레임 크기 350X300 설정
		setVisible(true); //프레임을 화면에 출력
		
	}
	
	private class MyListener implements ActionListener{			
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource();
			
			if(b.getText().equals("확인")) { //확인을 눌렀을 떄 
				System.out.println(pt1.getText() +"\t" + pt2.getText() +"\t" + pt3.getText() +"\t" + pt4.getText());
			}
			else {//리셋
				pt1.setText(""); //JTextField 값을 리셋
				pt2.setText(""); //JTextField 값을 리셋
				pt3.setText(""); //JTextField 값을 리셋
				pt4.setText(""); //JTextField 값을 리셋
			}
		
		}
	}
	
	public static void main(String[] args) {
		new GuiTest();
	}
}

 

실습2| 계산하는 GUI 구현

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class CalcFrame extends JFrame{
	JTextField num1, num2, result; // 두개의 값을 입력 받음
	JLabel lbl; // x 를 표현할 Label 
	JButton btn; // = 버튼
	int r_num = 0; // 곱한 값을 저장하는 변수
	
	
	public CalcFrame(){
		setTitle("계산기"); //창 레이블 설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X눌럿을때 창을 닫도록
		
		Container c = getContentPane(); //컨테이너 선언
		c.setLayout(new FlowLayout()); // 레이아웃은 FlowLayout으로
		MyListener ml = new MyListener(); //이벤트 선언
		
		num1 = new JTextField(5); //num1
		num1.addActionListener(ml); //이벤트에 추가
		lbl = new JLabel("X"); //곱하기를 나타냄
		num2 = new JTextField(5); //um2
		num2.addActionListener(ml); //이벤트에 추가
		btn = new JButton("="); //=을 나타낼 버튼
		btn.addActionListener(ml); //이벤트에 추가
		result = new JTextField(10); //계산 결과
		result.addActionListener(ml); //이벤트에 추가
	
		
		c.add(num1); c.add(lbl); c.add(num2); c.add(btn); c.add(result); //컨테이너에 추가
		setSize(400,100);
		setVisible(true);
		
	}
	
	private class MyListener implements ActionListener{			
		@Override
		public void actionPerformed(ActionEvent e) {
			String num_1 = num1.getText();  //num_1에 입력받은 숫자(문자열 형태)를 받음
			int num1 = Integer.parseInt(num_1); // num1에 다시 입력받은 문자열을 정수로 변환
			String num_2 = num2.getText(); //num_1과 같은 방법
			int num2 = Integer.parseInt(num_2); //num1_1과 같은 방법
			JButton b = (JButton)e.getSource(); 
			
			if(b.getText().equals("=")) { // = 버튼을 눌렀을 떄 
				int a = num1 * num2 ; //정수형태로 변환한 값을 곱하기
				result.setText(a+ ""); //출력
			}
		}
	}
	
	public static void main(String[] args) {
		new CalcFrame();
	}
}

실습3| Mouse 이벤트

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseEventFrame extends JFrame{
	public MouseEventFrame() { 
		setTitle("마우스 올리기 내리기");//창의 네임? 설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X클릭했을때 닫히도록
		
		Container c = getContentPane(); //컨테이너 선언
		c.setLayout(new FlowLayout()); //Layout은 FlowLayout으로 
		
		JLabel JL= new JLabel("사랑해"); //JLabel을 사용해 사랑해 출력
		c.add(JL); //컨테이너에 추가
		
		JL.addMouseListener(new MouseAdapter(){ //익명클래스로 구현, MouseAdapter 클래스 활용
			public void mouseEntered(MouseEvent e) { //MouseEnterd 메소드 구현
				JLabel J = (JLabel)e.getSource(); 
				J.setText("Love Java"); //마우스를 올리면 Love Java 출력
			}
			public void mouseExited(MouseEvent e) { //mouseExited 메소드 구현
				JLabel L = (JLabel)e.getSource();
				L.setText("사랑해"); // 마우스를 내리면 사랑해 출력
				
			}
		});
				
		setSize(400,200);
		setVisible(true);
		
	}

	public static void main(String[] args) {
		new MouseEventFrame();
	}
}

실습4| 클릭 스윙 프로그램

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ClickPracticeFrame extends JFrame{
	JLabel JL;
	public ClickPracticeFrame() {
		setTitle("클릭 연습 용 응용프로그램");//창의 네임? 설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X클릭했을때 닫히도록
		
		Container c = getContentPane(); //컨테이너 설정
		c.setLayout(null); //레이아웃 없음
		JL = new JLabel("C");//C를 출력하는 JLabel 하나 만들기
		JL.addMouseListener(new MyMouseListener()); // 클릭했을 때의 이벤트 추가
		JL.setSize(10,10); //C글짜의 크기 지정
		JL.setLocation(100,100); //글자의 위치를 100,100 으로 지정
		
		
		c.add(JL); //컨테이너의 추가
		setSize(400,400); //창의 크기 지정
		setVisible(true); // 창이 보이도록
	}
	
	private class MyMouseListener extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) { //Adapter를 통해 clicked 했을 때만 오바라이드
			int x = (int)(Math.random()*299+1); //300까지 , 글씨가 10,10 이라 399+1 했을 떄 글씨가 사라지는 경우에 대비해서 조금 작게 설정
			int y = (int)(Math.random()*299+1); //300까지
			JL.setLocation(x,y); //랜덤으로 바뀐 x,y 값을 JL의 위치로 재설정
		}
	}

	public static void main(String[] args) {
		new ClickPracticeFrame();
	}
}

실습5| 드래기 스윙 프로그램

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseDraggingFrame extends JFrame{
	Container c; //컨테이너 선언
	public MouseDraggingFrame() {
		setTitle("드래깅동안 YELLOW"); //창의 네임? 설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X눌렀을 때 닫히도록
		
		c = getContentPane();
		c.setLayout(null); //컨테이너의 레이아웃 없음
		c.setBackground(Color.GREEN);//기본 배경색을 초록으로
		c.addMouseMotionListener(new MyMouseMotionAdapter()); //마우스 드래그 했을 때의 이벤트 추가
		c.addMouseListener(new MyMouseListener()); //마우스를 땠을 때의 이벤트 추가
		setSize(400,200); //크기 지정
        setVisible(true); //창이 보이도록 지정
	}
	private class MyMouseMotionAdapter extends MouseMotionAdapter{
		@Override
		public void mouseDragged(MouseEvent e) {
			c.setBackground(Color.YELLOW); //마우스 드래그 했을 때 색이 노랑색이 되도록 설정
		}
	}
	private class MyMouseListener extends MouseAdapter{
		@Override
		public void mouseReleased(MouseEvent e) {
			c.setBackground(Color.GREEN); //마우스를 땠을 때 색이 다시 초록이 되도록 설정
		}
		
	}
	public static void main(String[] args) {
		new MouseDraggingFrame();		
	}
}

실습6| 화살표키를 사용한 스윙 프로그램

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MoveStringFrame extends JFrame{
	JLabel JL; //JL 미리선언
	String text = "Love Java"; //text도 선언
	
	public MoveStringFrame() {
		setTitle("Left 키로 문자열 회전"); //창의 네임? 설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X눌렀을 때 닫히도록
		
		Container c = getContentPane(); //컨테이너 선언
		c.setLayout(new FlowLayout()); //FlowLayout 지정
		
		JL = new JLabel("Love Java"); //JLabel 을 사용해 Love Java 보여줌
		JL.addKeyListener(new MyKeyAdapter()); //이벤트 추가
		
		JL.setSize(200,30); //JL의 크기를 지정
		c.add(JL); //컨테이너에 JL을 추가
		setSize(400,200); //창의 크기 지정
		setVisible(true); //창이 보이도록 지정
		JL.requestFocus(); //키 이벤트를 받을 컴포넌트를 강제로 설정
		
	}
	
	private class MyKeyAdapter extends KeyAdapter{
		@Override
		public void keyPressed(KeyEvent e) { //keyPressd만 오버라이드 하기
			int keyCode = e.getKeyCode();
			String LJ1, LJ2;
			
			if(keyCode == KeyEvent.VK_LEFT) {
				LJ1 = text.substring(1); //1번째부터 끝까지 문자열 받아오기
				LJ2 = text.substring(0,1); //0번째 문자열 받아오기
				text = LJ1.concat(LJ2); //1번째~끝번째 먼저 다음에 0번째 문자를 붙이기 concat사용
				JL.setText(text); //JL에 바꾼 text를 설정하기
			}
		}		
	}
	public static void main(String[] args) {
		new MoveStringFrame();
	}
}

'Programming > JAVA' 카테고리의 다른 글

그래픽  (0) 2020.12.30
기본적인 스윙 컴포넌트와 활용  (0) 2020.12.30
자바 GUI 기초, AWT와 스윙  (0) 2020.12.30
자바 기말 플젝 코드(미완성)  (0) 2020.12.30
입출력 스트림과 파일 입출력  (0) 2020.10.16

댓글