알버트의 개발하는 블로그

자바 제27강 : 자바 JPanel 상속받아 MouseMotionListener 클래스로 원 그려보기 본문

프로그래밍 언어/Java

자바 제27강 : 자바 JPanel 상속받아 MouseMotionListener 클래스로 원 그려보기

알버트 2021. 9. 13. 10:31

 

이번 시간에는 자바에서 제공하는 MouseMotionListener 클래스를 통해서 윈도우창 안에 원을 그려보는 작업을 해보도록 하겠습니다. MouseMotionListener은 마우스의 모션을 듣고 그 모션에 따른 작업을 하게 해주는 클래스입니다.

바로 간단한 예제를 통해서 MouseMotionListener 클래스를 사용해보겠습니다.

 


MouseMotionListener 클래스 예제

package kr.koreait.listenerTest;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseMotionListenerTest3 extends JPanel {
	
//	마우스 모션을 잡아줄 xpostion과 yposition 변수
	static int xpos = 50, ypos = 50;
	
	public static void main(String[] args) {
		
//		window 객체 생성
		JFrame window = new JFrame();
		
//		window 제목 설정
		window.setTitle("MouseMotionListenerTest");
		
//		window의 위치와 크기 설정
		window.setBounds(800, 100, 400, 500);
		
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		MouseMotionListenerTest3 graphic = new MouseMotionListenerTest3();
//		프레임 객체 생성
		window.add(graphic);
		
//		MouseMotionListener을 걸어준다.
		graphic.addMouseMotionListener(new MouseAdapter() {
			@Override
			public void mouseDragged(MouseEvent e) {
//				getX() -> X의 위치를 얻어온다.
				xpos = e.getX() - 15;
				ypos = e.getY() - 15;
//				그래픽을 다시 그려준다.
				graphic.repaint();
			}
		});
		
		window.setVisible(true);
		
	}

	@Override
	public void paint(Graphics g) {
//		색깔 빨강으로 설정
		g.setColor(Color.RED);
//		설정된 xpos와 ypos로 빨간 원을 그려준다.
		g.fillOval(xpos, ypos, 30, 30);
	}
}

소스 코드는 이와 같습니다. 주석으로 해당 코드에 대한 설명을 붙여놓았습니다.

MouseMotionListener을 프레임 객체에 걸어 주었습니다. 그리고 MouseMotionListener 메소드를 오버라이드(재정의) 해주었는데요. mouseDragged() 메소드를 통해서 xpos과 ypos의 값이 마우스 커서의 움직임에 따라 달라지도록 코딩해주었습니다. 그리고 그래픽이 수정되었을 때는 반드시 repaint() 메소드를 끝에 붙여주어야 합니다. 이제 한번 실행해보겠습니다.

 

 

프로그램을 실행하면 초기화면으로 이렇게 나옵니다. 이제 마우스를 저 점에서 움직여주면?

 

 

 

 

이처럼 마우스의 드래그에 따라서 빨간색 원이 그려지는 것을 볼 수 있습니다. 이처럼 MouseMotionListener 클래스는 마우스의 모션에 따라서 다양한 코딩을 할 수 있기 때문에 정말 유용한 클래스라고 할 수 있겠습니다. 읽어주셔서 감사합니다!