[JAVA] SWING 마우스 리스너

Madeline👩🏻‍💻·2022년 9월 18일

JAVA

목록 보기
1/1

복전생의 눈물나는 복습공부

SWING MouseListener에 대해 알아보자.

  1. 생성자를 만든다!
import javax.swing.JFrame;
public class MouseAndKeyboard extends JFrame {//생성자

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();//일꾼 생성!
	}
}
  1. 패널을 만든다!
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class MouseAndKeyboardPanel extends JPanel{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		add(text);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}

}
  1. 이벤트 리스너 만든다!
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		text.addMouseListener(new MouseListener() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("click!");
			}
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("press!");
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				System.out.println("release!");
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("enter!");
			}
			@Override
			public void mouseExited(MouseEvent e) {
				System.out.println("exit!");
			}
		});
		add(text);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}

}

//click은 한 자리에서! press와 release는 드래그하고 떼어냈을 때 해당한다.
//해당 코드는 컴포넌트에만 작동한다.
  1. 컴포넌트 말고 패널 전체에 해당하게 해보자. 이번에는 패널의 색깔을 바꿔보자.
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		add(text);
		this.addMouseListener(new MouseListener() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("click!");
			}
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("press!");
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				System.out.println("release!");
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				setBackground(Color.DARK_GRAY);
			}
			@Override
			public void mouseExited(MouseEvent e) {
				setBackground(Color.RED);
			}
		});
		add(text);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}
내용을 입력하세요.
//사실은 패널이라는 변수가 필요하다.

JPanel p = this;

p.setBackground(Color.DARK_GRAY);

//무명클래스 속 로컬변수는 접근 가능하다. 단 final변수처럼 만들면서 값을 주고, 변하지 않아야 한다.

이렇게 되면 코드가 복잡해진다. 패널이 모든 것을 해결하고 있는데,

무명클래스 말고 패널 전체가 마우스리스너를 구현하게 해보자.
  1. 패널 전체에서 MouseListener
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel implements MouseListener{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		add(text);
		this.addMouseListener(this);
		
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println("click!");
	}
	@Override
	public void mousePressed(MouseEvent e) {
		System.out.println("press!");
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		System.out.println("release!");
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		p.setBackground(Color.DARK_GRAY);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		setBackground(Color.RED);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}
내용을 입력하세요.

//가독성을 위해 기존 함수들을 멤버 변수로 넣었다.
  1. 마우스 누르는 것을 자세히 알아보자. 마우스의 어느 위치를 누르는 지에 따라 다른 동작을 수행하도록 할 수 있다.
//마우스를 눌렀을 시 이벤트 분배기가 자동으로 호출한다. 그리고 호출 시 갖고 있는 정보를 이벤트 객체에 넣어준다.



import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel implements MouseListener{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		add(text);
		this.addMouseListener(this);
		
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		
		text.setText("Mouse is Pressed at ("+x+","+y+")");
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		setBackground(Color.DARK_GRAY);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		setBackground(Color.RED);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}

//다른 것도 마찬가지로 액션이 수행된 좌표를 구할 수 있다.
  1. 그렇다면 마우스 1,2,3(왼, 오, 가운데) 중 어디가 눌렸는지 구해보자
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel implements MouseListener{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		text = new JLabel("Mouse Test");
		add(text);
		this.addMouseListener(this);
		
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		text.setText("Mouse "+b+ " is Pressed at ("+x+","+y+")");
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		text.setText("Mouse "+b+ " is Released at ("+x+","+y+")");
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		setBackground(Color.DARK_GRAY);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		setBackground(Color.RED);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}
  • 왼쪽 마우스 버튼이 눌렸을 시에만 표기하자

if( b == MouseEvent.BUTTON1) {//left
			text.setText("Mouse "+b+ " is Pressed at ("+x+","+y+")");
		}
  • 더블 클릭은 ?
@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println("click count" +e.getClickCount());
	}

//짧은 인터벌로 계속 클릭하면 카운트가 계속 늘어난다!
  1. 마우스가 눌린 곳으로 레이블을 이동시켜보자!
//애초에 컴포넌트의 위치는 Layout manager가, Frame은 Boarder Layout Manager, Panel은 Flow Layout이 정해준다.


//컴포넌트의 위치를 바꾸려면, 디폴트로 있는 Layout Manager를 해고시키고, 내가 지정해야 한다!



this.setLayout(new FlowLayout());//이게 기본값


this.setLayout(null);//해고시킴


//위치를 지정하려면 사이즈도 정해주어야 한다! 좌표 기준은 컴포넌트 왼쪽 위 모서리 꼭지점 부분!



text.setLocation(100, 100);
text.setSize(50,20);

코드를 짜보자!

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class MouseAndKeyboardPanel extends JPanel implements MouseListener{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		
		this.setLayout(null);
		text = new JLabel("Text");
		add(text);
		
		text.setLocation(100, 100);
		text.setSize(50,20);
		
		this.addMouseListener(this);
		
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println("click count" +e.getClickCount());
		if(e.getButton()==MouseEvent.BUTTON1) {
			text.setLocation(e.getX(), e.getY());
		}
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		if( b == MouseEvent.BUTTON1) {//left
			System.out.println("Mouse "+b+ " is Pressed at ("+x+","+y+")");
		}
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		System.out.println("Mouse "+b+ " is Released at ("+x+","+y+")");
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		setBackground(Color.DARK_GRAY);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		setBackground(Color.RED);
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}
//클릭 하자마자 위치를 옮길지, 클릭하고 떼어낼 때 옮길 지 지정해주면 된다!
  1. 마우스를 드래깅하면서 끌고다닐 수 있을까?

=> 별도의 이벤트 리스너가 있어야 한다.

MouseMotionListener(this);


import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

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

class MouseAndKeyboardPanel extends JPanel implements MouseListener, MouseMotionListener{
	JLabel text;
	
	MouseAndKeyboardPanel(){
		
		this.setLayout(null);
		text = new JLabel("Text");
		add(text);
		
		text.setLocation(100, 100);
		text.setSize(50,20);
		
		addMouseListener(this);
		addMouseMotionListener(this);
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println("click count" +e.getClickCount());
		if(e.getButton()==MouseEvent.BUTTON1) {
			text.setLocation(e.getX(), e.getY());
		}
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		if( b == MouseEvent.BUTTON1) {//left
			System.out.println("Mouse "+b+ " is Pressed at ("+x+","+y+")");
		}
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		int x = e.getX();//integer
		int y = e.getY();
		int b = e.getButton();//어느 마우스 버튼이 눌렸냐
		System.out.println("Mouse "+b+ " is Released at ("+x+","+y+")");
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		setBackground(Color.DARK_GRAY);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		setBackground(Color.RED);
	}
	@Override
	public void mouseDragged(MouseEvent e) {
		System.out.println("DRAGGED"+e.getX() + "," +e.getY());
	}
	@Override
	public void mouseMoved(MouseEvent e) {
		System.out.println("MOVED"+e.getX() + "," +e.getY());
	}
}

public class MouseAndKeyboard extends JFrame {

	MouseAndKeyboard(){
		setTitle("Mouse and Keyboard");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		add(new MouseAndKeyboardPanel());
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MouseAndKeyboard();
	}
}

//드래깅해서 움직일 때마다 호출된다!
profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기

0개의 댓글