햄발
Swing4 (Event Listener , Key Listener) 본문
Event Listener 이벤트 리스너
package ch05;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
// 이벤트 리스너를 사용하는 방법
// 1. implements ActionListener 사용 하는 방법
// ActionListener --> 운영 체제가 제어하는 이벤트를 등록할 수 있다.
public class ColorChangeFrame extends JFrame implements ActionListener {
// 이벤트 리스너에 대한 개념을 이해하자.
private JButton button1;
public ColorChangeFrame() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button1 = new JButton("button1");
}
private void setInitLayout() {
setLayout(new FlowLayout());
add(button1);
setVisible(true);
}
private void addEventListener() {
// button1이 눌러지는지 계속 이벤트를 지켜 보고 있어
// 이벤트 등록
button1.addActionListener(this);
}
// 코드 테스트
public static void main(String[] args) {
new ColorChangeFrame();
} // end of main
// 약속 되어 있던 추상메서드를 오버라이드 했다.
// 이벤트가 발생 되면 이 메서드를 수행해 약속 되어 있음
// 단, 어떤 컴포넌트가 이벤트가 할당 되었는지 등록을 먼저 해주어야 한다.
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("actionPerformed 메서드 호출()");
System.out.println(e.toString());
}
} // end of class
package ch05;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ColorChangeFrame2 extends JFrame implements ActionListener {
private JPanel panel;
private JButton button1;
private JButton button2;
public ColorChangeFrame2() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout()); // BorderLayout
panel = new JPanel();
panel.setBackground(Color.yellow);
button1 = new JButton("click1");
button2 = new JButton("click2");
}
private void setInitLayout() {
add(button1, BorderLayout.NORTH);
add(button2, BorderLayout.SOUTH);
add(panel, BorderLayout.CENTER);
setVisible(true);
}
// 이 메서드에 책임은 이벤트 리스너만 등록
private void addEventListener() {
button1.addActionListener(this);
button2.addActionListener(this);
}
// 오버라이드 : 이벤트가 일어나면 호출 되어지는 메서드
@Override
public void actionPerformed(ActionEvent e) {
Object object = e.getSource();
// 주소값으로 비교도 가능
// 문자열 값으로 비교 가능
JButton selectedButton = (JButton)e.getSource();
if(selectedButton == this.button1) {
System.out.println("button1 객체가 눌러졌다라고 판명 가능 ");
panel.setBackground(Color.yellow);
} else {
System.out.println("button2 객체가 눌러졌다라고 판명 가능 ");
panel.setBackground(Color.black);
}
}
// 코드 테스트
public static void main(String[] args) {
new ColorChangeFrame2();
} // end of main
}
연습하기!
package ch05;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Exercise extends JFrame implements ActionListener {
private JPanel panel1;
private JPanel panel2;
private JButton button1;
private JButton button2;
private JButton button3;
// 생성자
public Exercise() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("패널추가 연습");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
panel1 = new JPanel();
panel2 = new JPanel();
panel1.setBackground(Color.gray);
panel2.setBackground(Color.LIGHT_GRAY);
button1 = new JButton("click1");
button2 = new JButton("click2");
button3 = new JButton("click3");
}
private void setInitLayout() {
add(panel1, BorderLayout.CENTER);
add(panel2, BorderLayout.SOUTH);
panel2.add(button1);
panel2.setLayout(new FlowLayout());
panel2.add(button2);
panel2.setLayout(new FlowLayout());
panel2.add(button3);
panel2.setLayout(new FlowLayout());
setVisible(true);
}
private void addEventListener() {
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
Object object = e.getSource();
JButton seletedButton = (JButton) e.getSource();
if (seletedButton == this.button1) {
System.out.println("button1 객체가 눌러졌다 ! 라고 판명가능");
panel1.setBackground(Color.PINK);
}
if (seletedButton == this.button2) {
System.out.println("button2 객체가 눌러졌다 ! 라고 판명가능");
panel1.setBackground(Color.black);
}
if (seletedButton == this.button3) {
System.out.println("button3 객체가 눌러졌다 ! 라고 판명가능");
panel1.setBackground(Color.cyan);
}
}
// 코드 테스트
public static void main(String[] args) {
new Exercise();
}
}
Key Listener
package ch06;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
/**
* 키 이벤트 리스너 사용해보기
*/
public class MyKeyEvent extends JFrame {
private JTextArea textArea;
public MyKeyEvent() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false); // 프레임 사이즈 조절 불가
textArea = new JTextArea();
}
private void setInitLayout() {
// 좌표 기준으로 셋팅하고 싶다면 null
setLayout(new BorderLayout());
add(textArea);
setVisible(true);
}
private void addEventListener() {}
// 코드 테스트
public static void main(String[] args) {
new MyKeyEvent();
}
}
풀이
package ch06;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextArea;
/**
* 키 이벤트 리스너 사용해보기
*/
public class MyKeyEvent extends JFrame implements KeyListener {
private JTextArea textArea;
public MyKeyEvent() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false); // 프레임 사이즈 조절 불가
textArea = new JTextArea();
}
private void setInitLayout() {
// 좌표 기준으로 셋팅하고 싶다면 null
setLayout(new BorderLayout());
add(textArea);
setVisible(true);
}
private void addEventListener() {
// textArea 위에서 사용자기 키보드를 누르면 감지해서 나에게(코드기준) 알려줘
textArea.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("keyPressed : " + e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
// 문제 1
// 제어문을 활용해서 방향기 위 아래 왼쪽 오른쪽이 눌렀다가 때면
// 콘솔창에 한글로 위 아래 왼쪽 오른쪽 글자를 표기 하시오
System.out.println("keyCode : " + e.getKeyCode());
if(e.getKeyCode() == KeyEvent.VK_UP) {
System.out.println("위");
} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("왼쪽");
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("오른쪽");
} else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
System.out.println("아래");
}
}
}
미니게임 만들기 연습!
package ch06;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MiniGame1 extends JFrame {
private JLabel jPlayer;
public MiniGame1() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jPlayer = new JLabel("플레이어1");
jPlayer.setSize(200, 100);
}
private void setInitLayout() {
// 좌표 기반으로 배치관리자 변경
setLayout(null);
add(jPlayer);
jPlayer.setLocation(100, 100);
setVisible(true);
}
private void addEventListener() {
// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
// 익명 구현클래스로 KeyListener 인터페스를 재 정의할 수 있다.
// jPlayer.addKeyListener(this);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) {
jPlayer.setLocation(100, 50);
} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
jPlayer.setLocation(50, 50);
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
jPlayer.setLocation(200, 50);
} else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
jPlayer.setLocation(100, 350);
}
}
});
}
// 코드 테스트
public static void main(String[] args) {
new MiniGame1();
} // end of main
} // end of class
+ 상수를 이용해서 코드를 간편하게 만들기
package ch06;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MiniGame1 extends JFrame {
private JLabel jPlayer;
// 변수는 --> 변하는 수이기도 하다.
private int jPlayerX = 100;
private int jPlayerY = 100;
private final int MOVDE_DISTANCE = 50;
private final int FRAME_WIDTH = 500;
private final int FRAME_HEIGHT = 500;
private final String PLAYER_NAME = "야스오";
private final int PLAYER_WIDTH = 100;
private final int PLAYER_HEIGHT = 100;
public MiniGame1() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jPlayer = new JLabel(PLAYER_NAME);
jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);
}
private void setInitLayout() {
// 좌표 기반으로 배치관리자 변경
setLayout(null);
add(jPlayer);
jPlayer.setLocation(jPlayerX, jPlayerY);
setVisible(true);
}
private void addEventListener() {
// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
// 익명 구현클래스로 KeyListener 인터페스를 재 정의할 수 있다.
// jPlayer.addKeyListener(this);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) {
jPlayerY -= MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
jPlayerX -= MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
jPlayerX += MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
jPlayerY += MOVDE_DISTANCE;
}
jPlayer.setLocation(jPlayerX, jPlayerY);
}
});
}
// 코드 테스트
public static void main(String[] args) {
new MiniGame1();
} // end of main
} // end of class
연습
위 코드를 응용하여 배경에 이미지 를 움직이게 만들기!
package ch06;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MiniGamePractice extends JFrame {
private JLabel backgroundMap;
private JLabel jPlayer;
// 변수는 --> 변하는 수이기도 하다.
private int jPlayerX = 100;
private int jPlayerY = 100;
private final int MOVDE_DISTANCE = 50;
private final int FRAME_WIDTH = 500;
private final int FRAME_HEIGHT = 500;
private final String PLAYER_NAME = "커비";
private final int PLAYER_WIDTH = 200;
private final int PLAYER_HEIGHT = 200;
public MiniGamePractice() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
Icon icon = new ImageIcon("images/background2.jpg");
backgroundMap = new JLabel(icon);
backgroundMap.setSize(500, 500);
backgroundMap.setLocation(0, 0);
setTitle("움직이는 커비 만들기");
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jPlayer = new JLabel(PLAYER_NAME);
jPlayer = new JLabel(new ImageIcon("image4.png"));
jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);
}
private void setInitLayout() {
// 좌표 기반으로 배치관리자 변경
setLayout(null);
add(jPlayer);
add(backgroundMap);
backgroundMap.add(jPlayer);
jPlayer.setLocation(jPlayerX, jPlayerY);
setVisible(true);
}
private void addEventListener() {
// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
// 익명 구현클래스로 KeyListener 인터페스를 재 정의할 수 있다.
// jPlayer.addKeyListener(this);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) {
jPlayerY -= MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
jPlayerX -= MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
jPlayerX += MOVDE_DISTANCE;
} else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
jPlayerY += MOVDE_DISTANCE;
}
jPlayer.setLocation(jPlayerX, jPlayerY);
}
});
}
// 코드 테스트
public static void main(String[] args) {
new MiniGamePractice();
} // end of main
} // end of class
결과
'Java' 카테고리의 다른 글
Multi-Threading (0) | 2024.05.02 |
---|---|
Thread (1) | 2024.05.02 |
Swing - 3 (0) | 2024.04.29 |
Exception (예외처리) (0) | 2024.04.29 |
String, StringBuffer 클래스 (0) | 2024.04.29 |