Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

Swing4 (Event Listener , Key Listener) 본문

Java

Swing4 (Event Listener , Key Listener)

햄발자 2024. 4. 30. 15:33

 

 

 

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