본문 바로가기
Coding/JAVA

마우스로 문자열 이동시키기 : 마우스 이벤트 연습

by 찡콩찡 2022. 6. 14.
package chapter10;

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

import javax.swing.*;

public class MouseListenerEx extends JFrame {
	JLabel label = new JLabel("Hello");
	
	private MouseListenerEx(){ //생성자 호출
		setTitle("Mouse Event 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	  //c.addMouseListener(new MyMouseListener());
		c.addMouseListener(new MyMouseAdapter()); //기본 생성자 활용
		
		//1.레이아웃 세팅
		c.setLayout(null);
		label.setSize(50,20);  //hello 위치
		label.setLocation(30,30);
		c.add(label);
		
		//2. 화면에 프레임이 보이도록 세팅
		setSize(250,250);
		setVisible(true);
	}
	
	//MouseListener를 활용하는 방법
	class MyMouseListener implements MouseListener{
		public void mousePressed(MouseEvent e) {
			int x = e.getX();
			int y = e.getY();
			label.setLocation(x,y);
			
		}
		public void mouseReleased(MouseEvent e) {}
		public void mouseClicked(MouseEvent e) {}
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e) {}
		
	}
	//MouseAdapter를 활용하는 방법	
	class MyMouseAdapter extends MouseAdapter{
		public void mousePressed(MouseEvent e) {
			int x = e.getX();
			int y = e.getY();
			label.setLocation(x,y);
			
		}
	}
	
	
	
	
	public static void main(String[] args) {
		new MouseListenerEx();
	}
	
}

마우스 포인터에 따라 Hello가 움직임


KeyEvent와 포커스
  • 키 입력 시, 다음 세 경우에 key 이벤트 발생

      *  키를 누르는 순간

      *  누를 키를 떼는 순간

      *  누른 키를 떼는 순간(Unicode 키의 경우에만)

  • 키 이벤트를 받을 수 있는 조건

      * 모든 컴포넌트 가능하지만 현재 포커스를 가진 컴포넌트

  • 포커스(Focus)

      * 컴포넌트나 응용프로그램이 키 이벤트를 독점하는 권한

      * 컴포넌트에 포커스 설정 방법 :  다음 2라인의 코드 필요 

  • 스윙 프레임이 만들어질 포커스를 주고자 하는 경우

      * JFrame의 setVisible(true) 이후에 포커스를 주어야 함

setVisible(true);  //스윙 프레임 출력
      component.setFocus(true);
      component.requstFocus();
  • 마우스로 컴포넌트를 클릭할 때 포커스 지정하는 방법

     언제든지 필요할 때 포커스 줄 수 있음

component.addMouseListener(new MouseAdapter(){
 public void mouseClicked(MouseEvent e) {
   	Component c = (Component)e.getSource(); //클릭된 컴포넌트
    c.setFocusable(true);
    c.requestFocus();  
  }  
});
keyListener의 3개 메소드
1 ) 키를 누르는 순간 : void keyPressed(KeyEvent e) {
   // 이번트 처리 루틴
}
2) 누른 키를 떼는 순간: void keyReleased(KeyEvent e) {
  //  이벤트 처리 루틴
}
3) 누른 키를 떼는 순간 Unicode 키가 입력된 경우에만 : void keyTyped(keyEvent e) {
  //  이벤트 처리 루틴
}

컴포넌트에 키 이벤트 리스너 등록
Component.addkeyListener(myKeyListener);
package chapter10;

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

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

public class KeyCodeEx extends JFrame {
	JLabel[] label = new JLabel[3]; 
	
	public KeyCodeEx() { //생성자
		setTitle("keyListener 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.addKeyListener(new MyKeyListner());
		
		c.setLayout(new FlowLayout());		
		label[0] = new JLabel("getkeyCode() ");
		label[1] = new JLabel("getkeyChar() ");
		label[2] = new JLabel("getkeyText() ");
		
		for(int i=0;i < label.length; i++) {
			c.add(label[i]);
			label[i].setOpaque(true);
			label[i].setBackground(Color.YELLOW);
		}
		setSize(300,150);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
	}
	class MyKeyListner extends KeyAdapter{
		public void keyPressed(KeyEvent e) {
			int keycode = e.getKeyCode();
			char keyChar = e.getKeyChar();
			String keyText = e.getKeyText(keycode);
			
			label[0].setText(Integer.toString(keycode));
			label[1].setText(Character.toString(keyChar));
			label[2].setText(keyText);
		}
	}

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

	}

}

명품자바 예제 10-7
package chapter10;

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

import chapter09.ContentPaneEx;


public class KeyCode2Ex extends JFrame {
	Container c = getContentPane();
	private JLabel la = new JLabel();
	
	public KeyCode2Ex() { //생성자
		setTitle("keyCode2 예제: F1키:초록색, %키 노란색");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		c.addKeyListener(new MyKeyListener());
		c.add(la);
//		c.setLayout(new FlowLayout());		
					
		setSize(300,150);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();
				
	}
	class MyKeyListener extends KeyAdapter{
		public void keyPressed(KeyEvent e) {
		la.setText(e.getKeyText(e.getKeyCode()));
		
		if(e.getKeyChar() == '%') //%키를 판별하기 위해 e.getKeyChar()호출
			c.setBackground(Color.YELLOW);
		else if(e.getKeyCode() == KeyEvent.VK_F1) //F1 키를 판별하기 위해 e.getKeyCode() 호출 keyEvent.VK_F1 값과 비교
			c.setBackground(Color.GREEN);
		}
	}

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

	}

}

%

명품자바 10-8
package chapter10;

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

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

public class FlyingTextEx extends JFrame{
	JLabel label = new JLabel("Hello"); 
	Container c = getContentPane();	
	final int FLYING_UNIT =5;
	
	public FlyingTextEx() {
		
		setTitle("상하좌우키를 활용한 예재");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		c.setLayout(null);
		label.setSize(100,100);
		label.setLocation(50,50);
		c.add(label);
		c.addKeyListener(new MyKeyListner());
		
		setSize(300,300);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus();	
		
	}
	
	class MyKeyListner extends KeyAdapter{
		public void keyPressed(KeyEvent e) {
			int keycode = e.getKeyCode();
//			char keyChar = e.getKeyChar();
//			String keyText = e.getKeyText(keycode);
		
			switch (keycode) {
			case KeyEvent.VK_UP :
				label.setLocation(label.getX(),label.getY() - FLYING_UNIT);
				break;
			case KeyEvent.VK_DOWN :
				label.setLocation(label.getX(),label.getY() + FLYING_UNIT);
				break;
			case KeyEvent.VK_LEFT :
				label.setLocation(label.getX() - FLYING_UNIT, label.getY());
				break;
			case KeyEvent.VK_RIGHT:
				label.setLocation(label.getX() + FLYING_UNIT, label.getY());
				break;
					
		}
			
	}
  }
	public static void main(String[] args) {
		new FlyingTextEx();
	}
}

상 / 하 / 좌 / 우

package chapter10;

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


public class MouseListenerAllEx extends JFrame {
	Container c = getContentPane();
	JLabel la = new JLabel();
	
	public MouseListenerAllEx() {		
		setTitle("MouseListener와 MouseMotionListener 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		c.addMouseMotionListener(new MyMouseListener());
		c.addMouseListener(new MyMouseListener());
		c.add(la);
	
		setSize(300,300);
		setVisible(true);
		
		c.setFocusable(true);
		c.requestFocus(); 
}
	class MyMouseListener implements MouseListener, MouseMotionListener{
		public void mousePressed(MouseEvent e) {
//			c.setBackground(Color.CYAN);
			int r = (int)(Math.random() * 255);
			int g = (int)(Math.random() * 255);
			int b = (int)(Math.random() * 255);
			c.setBackground(new Color(r,g,b));			
			la.setText("mousePressed ("+ e.getX() + e.getY()+ ")");
		}
		
		public void mouseReleased(MouseEvent e) {	
			la.setText("mouseReleased (" + e.getX() + e.getY()+ ")");
		}
		public void mouseClicked(MouseEvent e) {
			la.setText("mouseClicked (" + e.getX() + e.getY()+ ")");
		}
		public void mouseExited(MouseEvent e) {	
			la.setText("mouseExited (" + e.getX() + e.getY()+ ")");
		}
		public void mouseDragged(MouseEvent e) {		
			la.setText("mouseDragged (" + e.getX() + e.getY()+ ")");
		}
		public void mouseMoved(MouseEvent e) {		
			la.setText("mouseMoved (" + e.getX() + e.getY()+ ")");
		}
		
		@Override
		public void mouseEntered(MouseEvent e) {
			
		}
		
	}
	public static void main(String[] args) {
		new MouseListenerAllEx();
	}

}

package chapter10;

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

public class MouseWheelEx extends JFrame{
	public MouseWheelEx () {
		setTitle("moseWheel"); //제목설정
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프레임 종료시 프로그램 종료
		setSize(300,300); //크기 설정
		setVisible(true); //창 보이기
		
		Container c = getContentPane(); //컨텐트팬 생성
		c.setLayout(new FlowLayout()); //flow 레이아웃 설정
		
		JLabel label = new JLabel("Love Java");
		label.setFont(new Font("Arial", Font.PLAIN,15)); //15픽셀 크기
		c.add(la);
		
		label.setFocusable(true);
		label.requestFocus();
		
		label.addMouseWheelListener(new MouseWheelListener() { //익명 리스너
			public void mouseWheelMoved(MouseWheelEvent e) {  //키가 눌리면 이벤트 발생
				int n =e.getWheelRotation();
				if(n<0) {
					JLabel label = (JLabel)e.getSource(); //이벤트 발생 시 레퍼런스 리턴
					Font f = label.getFont();
					int size = f.getSize();
					label.setFont(new Font("Arial", Font.PLAIN, size+5));
				}
				else {			
					JLabel label = (JLabel)e.getSource(); //이벤트 발생 시 레퍼런스 리턴
					Font f = label.getFont();
					int size = f.getSize();
					if (size <= 5) return;
					label.setFont(new Font("Arial", Font.PLAIN, size-5));
				}
			}
		});
	}

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

	}

}

Gambling Game 만들기
스윙으로 간단한 갬블링 게임을 만들어보자. 아래 그림과 같이 3개의 레이블 컴포넌트가 있따. 이 컴포넌트에는 각각 0~4까지의 한 자릿수가 출력된다. <Enter> 키를 입력할 때마다 3개의 수를 랜덤하게 발생시켜 레이블에 출력한다. 그러고 나서 모두 동일한 수이면 "축하합니다" 를 아니면 " 아쉽군요"를 출력한다.
package chapter10;

import java.awt.*;
import java.awt.event.*;
import java.security.PublicKey;
import java.util.*;

import javax.swing.*;

import chapter10.KeyCodeEx.MyKeyListner;

public class GamblingEx extends JFrame {
	private JLabel[] label = new JLabel[3];
	private JLabel sentence;
	
	public GamblingEx() {
		setTitle("Gamblig Game");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel gp = new JPanel();
		gp.setLayout(null);
		setContentPane(gp);
		
		for(int i=0;i<label.length;i++) {
			label[i] = new JLabel("0");
			//라벨 가운데맞춤
			label[i].setHorizontalAlignment(JLabel.CENTER);
			//setBounds(X,Y,W,H) 절대 위치와 크기 지정
			label[i].setBounds(50 + i * 80,50,60,40);
			//JLabel 배경색 설정 true로 설정해야 적용
			label[i].setOpaque(true);
			//라벨 색깔
			label[i].setBackground(Color.GREEN);
			//라벨 내용 색깔
			label[i].setForeground(Color.YELLOW);
			//폰트 객체 생성 (글자체/효과/글자크기) bold는 진하게 ITALIC은 기울여서
			Font font = new Font("궁서", Font.BOLD + Font.ITALIC, 25);
			label[i].setFont(font);
			gp.add(label[i]);			
		}
		sentence = new JLabel("시작합니다");
		sentence.setBounds(125,130,100,20);
		gp.add(sentence);
		gp.addKeyListener(new MyKeyListener());
		
		setSize(350,250);
		setVisible(true);
		
        //키 이벤트의 포커스를 받을 수 있는 컴포넌트가 여러 개 있을 때 
		//우선적으로 입력받기 위해 설정
		gp.setFocusable(true);
        //키 이벤트를 받을 멈포넌트를 강제로 설정
		gp.requestFocus();
	}
	
	public class MyKeyListener extends KeyAdapter {
		public void keyPressed(KeyEvent e) {
			if(e.getKeyChar() == '\n') { //Enter 입력 시
				int list[] = new int[3];
				for (int j=0; j<label.length;j++) {
				int x = (int) (Math.random() * 5);
				label[j].setText(Integer.toString(x));
				list[j] =x;
		}
		if((list[0] == list[1]) && (list[1] == list[2]))
				sentence.setText("축하합니다.!" );
		else {
			sentence.setText("아쉽군요");
		}
	  }
	}
	}
		
	public static void main(String[] args) {
		new GamblingEx();
	}
}