명품 자바 에센셜 9장 실습 문제

히치키치·2021년 6월 10일
0

요약

  • 이벤트 기반 프로그래밍
    이벤트 발생에 의해 프로그램 흐름/실행되는 코드 결정
    이벤트 발생 -> 이벤트 리스너 : 이벤트 처리 루틴 실행

  • 배치 실행 : 개발자가 프로그램 흐름 결정

  • 이벤트 소스 : 이벤트 발생시킨 GUI 컴포넌트
    이벤트 객체 : 발생한 이벤트에 대한 정보 제공 객체
    이벤트 리스너 : 사용자가 작성한 이벤트 처리 자바 프로그램 코드
    이벤트 분배 스레드 : 무한 루프 돌며 이벤트 발생시 이벤트 리스너 찾아 호출하는 스레드

  • 이벤트 처리 과정
    이벤트 발생->이벤트 객체 생성 ->이벤트 리스너 찾기->이벤트 리스너 실행 : 리스너에 이벤트 객체가 전달되며 리스너 코드 실행

  • getSource() : 발생 이벤트 소스 리턴
    Object 타입 리턴임으로 캐스팅하여 사용

  • ActionEvent : JButton : 마우스, <Enter> 키로 버튼 선택
    KeyEvent : Component : 키 누르기, 누른 키 떼기
    MouseEvent : Component : 마우스 조작

  • 이벤트 리스너 작성법 :
    독립 클래스,
    내부 클래스 : InnerClassListener.this.setTitle(b.getText()),
    익명 클래스 : AnnonymousClassListener.this.setTitle(b.getText()),

  • Adapter 클래스
    : ActionLister, ItemListenr는 메소드가 1개라 없음

  • 키 입력의 독점권 :현재 포커스 가진 컴포넌트에만 Key 이벤트 발생

  • component.setFocusable(true) : component가 포커스 받을 수 있도록 설정
    component.requestFocus();: component에게 포커스 줘 키 입력 받게 함

  • 모든 키 입력에 호출되는 KeyListener : keyPressed() -> keyreleased()

  • 유니코드 입력에 호출되는 KeyListener : keyPressed() -> keyTyped()->keyreleased()

  • component.addKeyListener(myKeyListener);

  • char KeyEvent.getKeyChar() : 입력된 키의 유니 코드 값 반환
    (유니코드 아닌 경우 : KeyEvent.CHAR_UNDEFINED 리턴)

  • int KeyEvent.getKeyCode() : 모든 키에 대한 정수형 키 코드 리턴
    (VK_ 의 가상 키 값과 비교)

  • 마우스 눌린 위치에서 뗄 때 호출되는 MouseListener : mousePressed()->mouseReleased()->mouseClicked()

  • 마우스가 드래그된 상태에서 호출되는 이벤트 : mousePressed ->mouseDragged -> ... ->mouseDragged->mouseReleased

  • component.addMouseListener(myMouseListener)

  • component.addMouseModtionListener(myMouseMotionListener)

  • MouseEvent.getX(), MouseEvent.getY() : 마우스 좌표 받기

  • MouseEvent.getClickCount() : 마우스 클릭 횟수 리턴

1번

JLabel 컴포넌트는 Mouse 이벤트를 받을 수 있다. JLabel 컴포넌트의 초기 문자열을 “자기야”라고 출력하고, 레이블에 마우스를 올리면 “사랑해”로, 내리면 “자기야”가 다시 출력되도록 프로그램을 작성하라.

package java_9;

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


public class one extends JFrame{
	
	public one(){
		this.setTitle("Java");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
				
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout());
		
		JLabel label=new JLabel("자기야");
		
		label.addMouseListener(new MouseListener() {
			public void mouseEntered(MouseEvent e) {
				label.setText("사랑해");
		}
			public void mouseExited(MouseEvent e) {
				label.setText("사랑해");
		}
			public void mousePressed(MouseEvent e) {}
			public void mouseReleased(MouseEvent e) {}
			public void mouseClicked(MouseEvent e) {}
		});
		
		c.add(label);
		
		this.setSize(300,300);
		this.setVisible(true);
		
	}
	
	public static void main(String[] args) {
		new one();
	}

}

2번

프레임의 컨텐트팬의 초기 색을 Color.CYAN으로 하고, R 키를 누르는 순간 배경색이 Color.RED 색으로 변했다가, 키를 떼면 다시 초기 색으로 돌아오는 프로그램을 작성하라.

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

public class two extends JFrame{
	public two() {
		this.setTitle("Java");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
				
		Container c = getContentPane();
		
		c.setBackground(Color.CYAN);
		c.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent e) {
				if(e.getKeyChar() == 'R') {
					c.setBackground(Color.RED);
				}
			}
			public void keyReleased(KeyEvent e) {
				c.setBackground(Color.CYAN);
			}
			public void keyTyped(KeyEvent e) {}
		});
		
		this.setSize(300, 300);
		this.setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
		
	}
	
	
	public static void main(String[] args) {
		new two();
	}
}

3번

컨텐트팬의 배경색은 초록색(Color.GREEN)으로 하고, 마우스의 드래깅 동안만 노란색(Color.YELLOW)으로 나타나는 프로그램을 작성하라. 드래깅을 멈추면 초록색이 된다

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

import javax.swing.*;

public class three extends JFrame{

public three() {
	this.setTitle("드래깅동안...");
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//this.setLocationRelativeTo(null);
	
	Container c=getContentPane();
	c.setBackground(Color.GREEN);
	c.setLayout(null);
	MyMouseListener listener=new MyMouseListener();
	c.addMouseListener(listener);
	c.addMouseMotionListener(listener);

	
	
	//c.addMouseMotionListener(new  MyMouseListener());
	c.setBackground(Color.YELLOW);
	this.setSize(300,300);
	this.setVisible(true);

	
}
class MyMouseListener implements MouseListener,MouseMotionListener{
	public void mouseReleased(MouseEvent e) {
		Component c=(Component)e.getSource();
		c.setBackground(Color.GREEN);
	}	
	public void mousePressed(MouseEvent e) {}
	public void mouseClicked(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	
	public void mouseDragged(MouseEvent e) {
		Component c=(Component)e.getSource();
		c.setBackground(Color.YELLOW);
	}
	public void mouseMoved(MouseEvent e) {}
	
}


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

}

4번

JLabel 컴포넌트를 이용하여 “Love Java”를 출력하고, + 키를 치면 폰트 크기를 5픽셀씩 키우고, - 키를 치면 폰트 크기를 5픽셀씩 줄이는 스윙 응용프로그램을 작성하라. 5픽셀 이하로 작아지지 않도록 하라.

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


public class four extends JFrame{
	
	public four() {
		this.setTitle("+,-키로 폰트...");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
		
		JLabel label=new JLabel("Love Java");
		
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		c.add(label);
		
		c.addKeyListener(new KeyListener() {
			
			public void keyPressed(KeyEvent e) {
				if(e.getKeyChar()=='+') {
					label.setFont(new Font("Arial", Font.PLAIN, label.getFont().getSize() + 5));
				}
				else if ((e.getKeyChar()=='-') && (label.getFont().getSize()>10)){
					label.setFont(new Font("Arial", Font.PLAIN, label.getFont().getSize() - 5));
				}
			}
			
			public void keyReleased(KeyEvent e) {}
			public void keyTyped(KeyEvent e) {}
		});
			
				
				
				
				
		c.setFocusable(true);
		c.requestFocus();
		
		this.setSize(300,300);
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new four();
	}
}

5번

클릭 연습용 스윙 응용프로그램을 작성하라. JLabel을 이용하여 문자열 “C”인 레이블을 하나 만들고 초기 위치를 (50, 50)으로 하라. 문자열을 클릭할 때마다 레이블은 프레임 내의 랜덤한 위치로 움직인다.

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

public class five extends JFrame{
	int x,y;
	public five() {
		
		this.setTitle("Java");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		JLabel label=new JLabel("C");
		c.setLayout(null);

		label.setBounds(50,50,40,40);
		
		label.addMouseListener(new MouseListener() {
			public void mouseClicked(MouseEvent e) {
				x = (int)(Math.random()*(getContentPane().getWidth() - label.getWidth()));
				y = (int)(Math.random()*(getContentPane().getHeight() - label.getHeight()));
				label.setLocation(x, y);
			}
			public void mousePressed(MouseEvent e) {}
			public void mouseReleased(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
		});
		
		c.add(label);
		this.setSize(300,300);
		this.setVisible(true);
		
		
	}
	public static void main(String[] args) {
		new five();
	}

}

6번

GridLayout을 이용하여 컨텐트팬에 숫자를 담은 JLabel을 12개를 부착하고, 초기 바탕색을 모두 Color.WHITE 색으로 한다. 그리고 각 레이블 위에 마우스로 클릭하면 랜덤한 색으로 채워지도록 프로그램을 작성하라. 랜덤한 색을 만드는 방법은 예제 9-6의 코드를 참고하라.

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


public class six extends JFrame{

	public six() {
		
		this.setTitle("3 x 4 color frame");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
		
		Container c=getContentPane();
		c.setLayout(new GridLayout(3,4));
		this.setSize(300,300);
		this.setVisible(true);
		
		for(int i=0;i<12;i++) {
			String text=Integer.toString(i);
			JLabel label=new JLabel(text);
			c.add(label);
			label.addMouseListener(new MouseListener() {
				public void mouseClicked(MouseEvent e) {
					JLabel label=(JLabel)e.getSource();
					int r=(int)(Math.random()*256); 
					int g=(int)(Math.random()*256); 
					int b=(int)(Math.random()*256); 
					label.setOpaque(true);
					label.setBackground(new Color(r,g,b));
				}
				public void mousePressed(MouseEvent e) {}
				public void mouseReleased(MouseEvent e) {}
				public void mouseEntered(MouseEvent e) {}
				public void mouseExited(MouseEvent e) {}				
			});
		}
		
	}
	
	public static void main(String[] args) {
		new six();
	}
}

0개의 댓글