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();
}
}



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();
}
}


'Coding > JAVA' 카테고리의 다른 글
기본적인 스윙 컴포넌트와 활용: JLabel을 이용한 레이블 만들기 / 체크박스 생성 예제 (0) | 2022.06.21 |
---|---|
[명품자바 예7-3] 문자열 입력받아 ArrayList에 저장 (0) | 2022.05.10 |
[명품자바] 07. 제네릭과 컬랙션 실습문제 4번 문제풀이 (0) | 2022.05.10 |
[혼공자바_07 상속] 예제 연습 (0) | 2022.04.27 |
[명품 자바] 추상클래스 구현 연습 예제 5-7 (0) | 2022.04.26 |