728x90
728x90

 

명품자바프로그래밍 10장 이벤트 처리

10장. 자바의 이벤트 처리 요약

 

이벤트 기반 프로그래밍 : 이벤트의 발생에 의해 프로그래밍

이벤트 소스 :
이벤트 객체 :

*ActionEvent, MouseEvent 많이 씀

 

이벤트 리스너 :

- 독립 클래스 :
- 내부 클래스 :
- 익명 클래스 :

어댑터 클래스

keyEvent 와 keyListener
-component.setFocusable(true);
-component.requestFocus();

keyTyped()
MouseEvent, MouseListener, MouseMotionListener, MouseWheelListener

유니코드키
유니코드가 아닌 키
가상 키

 

 

10장. 자바의 이벤트 처리 예제


| 예제 10-1 |
버튼을 클릭할 때 발생하는 Action 이벤트를 처리할 MyActionListener 클래스를 독립클래스로 작성하고 클릭할 때마다 버튼 문자열이 "Action"과 "액션"으로 번갈아 변하도록 하라.

※ 독립클래스로 Action 이벤트의 리스너 작성

package test10;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


/*class MyAction implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent arg0) {
		JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
		if(b.getText().equals("Action"))
			b.setText("액션");
		else b.setText("Action");
		}
	}*/

public class EventTest01 extends JFrame {
	JButton btn;
	
	EventTest01() {
		setTitle("이벤트처리");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		btn=new JButton("Action");
		c.add(btn);
		setVisible(true);
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
				if(b.getText().equals("Action"))
					b.setText("액션");
				else b.setText("Action");
	}
		});
	}
	public static void main(String[] args) {
		new EventTest01();
	}
	/*class MyAction implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent arg0) {
			JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
			if(b.getText().equals("Action"))
				b.setText("액션");
			else b.setText("Action");*/
}

 

 

 

| 예제 10-2 |  10-1과 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.

※ 내부클래스로 Action 이벤트의 리스너 작성

package test10;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//class MyAction implements ActionListener{
//	private JTextField tf1, tf2;
//	private JLabel la;
//	MyAction(JTextField tf1, JTextField tf2, JLabel la){
//		this.tf1=tf1;
//		this.tf2=tf2;
//		this.la=la;
//	}
//	@Override
//	public void actionPerformed(ActionEvent arg0) {
//		//JButton b=(JButton)arg0.getSource();
//		int num1=Integer.parseInt(tf1.getText());
//		int num2=Integer.parseInt(tf2.getText());
//		la.setText((num1+num2)+"   ");
//		
//	}
//	
//}

public class EventTest02 extends JFrame {
	JTextField tf1, tf2;
	JLabel la; //값이 안바뀌어서 만들필요 ㄴㄴ
	JButton btn;

	EventTest02() {
		setTitle("이벤트처리");
		setSize(200, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new GridLayout(4,1));
		
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		JPanel p3 = new JPanel();

		tf1 = new JTextField(10);
		p1.add(new JLabel("숫자1: "));
		p1.add(tf1);

		tf2 = new JTextField(10);
		p2.add(new JLabel("숫자2: "));
		p2.add(tf2);
		
		la=new JLabel("처리결과");
		p3.add(new JLabel("계산결과"));
		p3.add(la);
		btn=new JButton("더하기");
		c.add(p1);
		c.add(p2);
		c.add(btn);
		c.add(p3);
				
		setVisible(true);
		btn.addActionListener(new MyAction());
	}

	public static void main(String[] args) {
		new EventTest02();
	}
	class MyAction implements ActionListener{
//		private JTextField tf1, tf2;
//		private JLabel la;
//		MyAction(JTextField tf1, JTextField tf2, JLabel la){
//			this.tf1=tf1;
//			this.tf2=tf2;
//			this.la=la;
//		}
		@Override
		public void actionPerformed(ActionEvent arg0) {
			//JButton b=(JButton)arg0.getSource();
			int num1=Integer.parseInt(tf1.getText());
			int num2=Integer.parseInt(tf2.getText());
			la.setText((num1+num2)+"   ");
			
		}
		
	}
}

 

 

 

| 예제 10-3 | 10-1, 10-2와 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.

※ 익명클래스로 Action 이벤트의 리스너 작성

대기중

 

 

 

| 예제 10-4 | 컨탠트팬의 아무 위치에 마우스버튼을 누르면 마우스 포인트가 있는 위치로 "hello"문자열을 옮기는 스윙 응용프로그램을 작성하라. #마우스이벤트연습

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseTest extends JFrame implements MouseListener{
	JLabel la;
	Container c;
	
	MouseTest(){
		setTitle("Mouse 이벤트예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		c=getContentPane();
		c.setLayout(null);
		la=new JLabel("Hello");
		la.setSize(50,20);
		la.setLocation(10, 10);
		c.add(la);		
		setVisible(true);
		c.addMouseListener(this);
	}
	public static void main(String[] args) {
		new MouseTest();
	}
	@Override
	public void mouseClicked(MouseEvent arg0) {
		// 좌표가 없어도 됨
		// c.setBackground(Color.RED);
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		// 마우스가 화면 안에 들어올 때
		// c.setBackground(Color.BLACK);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// 마우스가 화면 밖에 나갈 때
		// c.setBackground(Color.YELLOW);
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x=e.getX();
		int y=e.getY();
		la.setLocation(x, y);  //클릭하는 위치
	}
	@Override
	public void mouseReleased(MouseEvent e) {
         // 안쓴다고 지우면 에러납니다.
        // 키를 떼는 순간
	}
}

 

 

 

| 예제 10-5 | MouseAdapter를 이용하여 예제 10-4를 수정하라.

package test10;

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseAdapterTest extends JFrame {
	JLabel la;
	
	MouseAdapterTest(){
		setTitle("마우스어댑터테스트");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(null);
		
		la=new JLabel("Hello");
		la.setBounds(10,10,50,20);
		c.add(la);
		setVisible(true);
		
		c.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				int x=e.getX();
				int y=e.getY();
				la.setLocation(x, y);
			}
		});
	}
	public static void main(String[] args) {
		new MouseAdapterTest();
	}
}

 

 

 

| 예제 10-6 | 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.

※ keyEvent와 keytListener의 활용

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class KeyEventTest01 extends JFrame implements KeyListener{
	private JLabel[] keyMessage;
	
	KeyEventTest01(){
		setTitle("keyListener 예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		c.addKeyListener(this);
		keyMessage=new JLabel[3];
		keyMessage[0]=new JLabel("getKeyCode");
		keyMessage[1]=new JLabel("getKeyChar");
		keyMessage[2]=new JLabel("getKeyText");
		
		for(int i=0; i<keyMessage.length; i++) {
			c.add(keyMessage[i]);
			keyMessage[i].setOpaque(true);  //레이블 배경은 기본이 투명. 텍스트는 아님!
			keyMessage[i].setBackground(Color.YELLOW);
		}
		setVisible(true);  
		c.setFocusable(true);  //포커스 받을 수 있게 함
		c.requestFocus();  		
	}

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

	@Override
	public void keyPressed(KeyEvent arg0) {
		//눌러졌을때 키코드를 얻음
		//1번 (작동순서)
		int keyCode=arg0.getKeyCode();
		int keyChar=arg0.getKeyChar();
		String keyStr=arg0.getKeyText(keyCode);
		keyMessage[0].setText(keyCode+"");
		keyMessage[1].setText(keyChar+"");
		keyMessage[2].setText(keyStr+"");
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		//3번
//		int keyCode=arg0.getKeyCode();
//		int keyChar=arg0.getKeyChar();
//		String keyStr=arg0.getKeyText(keyCode);
//		keyMessage[0].setText(keyCode+"");
//		keyMessage[1].setText(keyChar+"");
//		keyMessage[2].setText(keyStr+"");
//		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		//2번.유니코드만 받습니다.
//		int keyCode=arg0.getKeyCode();
//		int keyChar=arg0.getKeyChar();
//		//String keyStr=arg0.getKeyText(keyCode);
//		keyMessage[0].setText(keyCode+"");
//		keyMessage[1].setText(keyChar+"");
//		keyMessage[2].setText("");
//		
	}
}

 

 

 

| 예제 10-7 | 다음 그림과 같이 <F1> 키를 입력받으면 콘텐트팬의 배경을 초록색으로, % 키를 입력받으면 노란색으로 변경하는 응용프로그램을 만들어라.

※ 사용자가 키를 입력하면 입력된 키의 이름 문자열을 화면에 출력한다. %키는 shift 키 입력 후 5를 입력한 경우로서 최종적으로 입력된 키는 5이므로 오른쪽 화면에 5키가 입력되었음이라고 출력되어 있다. f1키를 받기 위해 KeyEvent의 getKeycode()메소드를 이용하여야 하며, % 키는 getKeyChar() 메소드를 이용하면 된다.

 

 

 

| 예제 10-8 | 상,하,좌,우 키를 이용하여 "Hello" 문자열을 움직이는 응용프로그램을 작성하라.

※ "Hello" 문자열은 JLabel 컴포넌트로 만들어 컨텐트팬에 부착하고 상,하, 좌,우 키를 움직이면 키 방향으로 한 번에 10픽셀씩 움직인다 이를 위해 컨텐트팬의 배치관리자를 삭제하여야 한다. "Hello" 문자열을 초기에 (50,50) 위치에 출력하라.

package test10;

import java.awt.Container;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class p1008 extends JFrame{
	JLabel la;
	int x=50, y=50;
	p1008(){
		setTitle("10장 8번 예제");
		setSize(300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(null);
		la=new JLabel("Hello");
		la.setBounds(x,y,30,20);
		c.add(la);
		c.setFocusable(true);
		c.requestFocus();
		setVisible(true);
		c.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				switch((int) e.getKeyCode()) {
				case KeyEvent.VK_UP:
					if(y-10<0)
						y=0; 
					else
						y-=10;  
					break;
				case KeyEvent.VK_DOWN:
					if(y+10>c.getHeight()-20)
						y=c.getHeight()-20;
					else
						y+=10;
					break;
				case KeyEvent.VK_LEFT:
					if(x-10<0)
						x=0;
					else
						x-=10;
					break;
				case KeyEvent.VK_RIGHT:
					if(x+10>c.getWidth()-30)
						x=c.getWidth()-30;
					else
						x+=10;		
				}
				la.setLocation(x, y);
				//이미 있는 위치 옮기는 것은 repaint가 필요없음 
			}
		});
	}	
	public static void main(String[] args) {
		new p1008();
	}
}

 

 

 

| 예제 10-9 | 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.

※ keyEvent와 keytListener의 활용

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseEventTest02 extends JFrame{
	JLabel la;
	Container c;
	MouseEventTest02(){
		
		setTitle("10-9");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		c=getContentPane();
		c.setLayout(new FlowLayout());
		la=new JLabel("No Mouse Event");   //메모리 할당
		c.add(la);
		setVisible(true);
		
		MyMouseListener l=new MyMouseListener();
		c.addMouseListener(l);
		c.addMouseMotionListener(l);
	}

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

	}
	class MyMouseListener implements MouseListener,MouseMotionListener {

		@Override
		public void mouseDragged(MouseEvent arg0) {
			la.setText("mouseDragged("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseMoved(MouseEvent arg0) {
			la.setText("mouseMoved("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseClicked(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent arg0) {
			c.setBackground(Color.CYAN);
			
		}

		@Override
		public void mouseExited(MouseEvent arg0) {
			c.setBackground(Color.MAGENTA);
			
		}

		@Override
		public void mousePressed(MouseEvent arg0) {
			la.setText("mousePressed("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseReleased(MouseEvent arg0) {
			la.setText("mouseReleased("+arg0.getX()+","+arg0.getY()+")");

		}
	}
}

 

 

| 예제 10-10 |...

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v