스윙 - 마우스 (액 션)

본 고 는 학습 중의 총 결 입 니 다. 전재 하 는 것 을 환영 하지만 출처 를 밝 혀 주 십시오.http://blog.csdn.net/pistolove/article/details/41346969
 이 글 을 다 읽 으 면 다음 과 같은 지식 을 배 울 수 있 습 니 다. 
    (1) JAVASWING 에서 마우스 감청 에 자주 사용 되 는 감청 기 는 Mouse Listener, Mouse Wheel Listener, Mouse Motion Listener 를 포함한다.
    (2) 마우스 모니터 의 역할 이 각각 무엇 인지, 마우스 가 어떤 조작 을 할 때 호출 된다.
    (3) Mouse Listener 와 Mouse Adapter 의 차 이 는 Mouse Listener 가 아 닌 Mouse Adapter 를 사용 하 는 것 이 좋 습 니 다. 그러면 코드 가 비교적 깔끔 합 니 다.
    (4) 사례 를 통 해 이러한 감청 을 더욱 이해한다.
사용자 가 마 우 스 를 클릭 할 때 세 개의 모니터 방법 을 호출 합 니 다.
     A: 마우스 가 처음 눌 렸 을 때 mousePressed 를 호출 하고 마우스 가 풀 렸 을 때 mouseReleased 를 호출 하 며 마지막 으로 mouseClicked 를 호출 합 니 다.
     B: 마우스 이벤트 클래스 의 대상 을 매개 변수 로 getX () 와 getY () 방법 을 호출 하면 마우스 가 눌 렸 을 때 마우스 포인터 가 x 와 y 좌표 에 있 는 것 을 얻 을 수 있 습 니 다.
     C: 클릭, 더 블 클릭, 세 번 의 클릭 으로 구분 하려 면 getClickCount 방법 을 사용 해 야 합 니 다.주의해 야 할 것 은:
  (1) 마 우 스 를 움 직 이 는 동시에 마 우 스 를 누 르 면 mouse Dragged 가 아 닌 mouse Moved 를 호출 합 니 다.마우스 가 한 구성 요소 내부 에 머 물 때 만 mouse Moved 방법 을 사용 할 수 있 습 니 다. 마우스 가 끌 면
           구성 요소 밖으로 나 가면 mouse Dragged 방법 도 호출 됩 니 다.
  (2) mouseEntered 와 mouseExited 방법 은 마우스 로 구성 요소 에 들 어가 거나 이동 할 때 호출 됩 니 다.
  (3) 대부분 응용 프로그램 에서 마우스 클릭 에 관심 이 있 고 마우스 이동 에 관심 이 없 지만 마우스 이동 사건 이 발생 하 는 빈도 가 높 기 때문에 마우스 이동 사건 과 드래그 사건 은 따로 정의 된다.
          Mouse Motion Listener 는 인터페이스 에 독립 되 어 있 습 니 다.
MouseListener VS MouseAdapter VS MouseWheelListener VS MouseMotionListener VS MouseMotionAdapter
(1) 위의 몇 가지 감청 에서 비교적 자주 사용 하 는 것 은 Mouse Listener 와 Mouse Motion Listener 이 고 Mouse Wheel Listener 는 비교적 적 게 사용한다.
(2) Mouse Adapter 는 Mouse Listener 를 확 장 했 습 니 다. Mouse Adapter 는 목적 성 이 강 합 니 다. Mouse Listener 의 모든 방법 이 필요 하지 않 을 때 Mouse Adapter 를 사용 하여 필요 한 것 을 선택 할 수 있 습 니 다.
        어떤 것 이나 몇 가지 감청 으로 이 루어 지면 코드 가 더욱 간결 해 보이 고 코드 의 양 도 줄어든다.
(3) Mouse Motion Adapter 도 Mouse Motion Listener 를 확장 했다.
(4) Mouse Wheel Listener 는 마우스 휠 모니터 로 이 감청 을 사용 하지 않 는 다.
/ * * 마우스 리스터 인터페이스 에 마우스 방법 5 개 포함 * /
button.addMouseListener(new MouseListener(){
	@Override
	public void mouseClicked(MouseEvent e) {
		/**          (     )   。**/
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		/**           。**/
	}

	@Override
	public void mouseExited(MouseEvent e) {
		/**         。**/
	}

	@Override
	public void mousePressed(MouseEvent e) {
		/**             。**/
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		/**             。**/
	}}
);

/ * 추상 류 Mouse Adapter (재 작성 에 필요 한 방법 만) 감청 방법 을 자 유 롭 게 결정 할 수 있 음 * * /
button.addMouseListener(new MouseAdapter(){
	/**    mouseClicked   **/
	@Override
	public void mouseClicked(MouseEvent e) {
		super.mouseClicked(e);
	}
});

/ * 구성 요소 의 마우스 이동 사건 을 수신 하 는 디텍터 인터페이스.클릭 및 기타 마우스 이벤트 에 대해 서 는 MouseListener 를 사용 하 십시오. * * /
button.addMouseMotionListener(new MouseMotionListener(){
	@Override
	public void mouseDragged(MouseEvent e) {
		/**                。**/
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		/**                   。**/
	}
});

/ * 구성 요소 의 마우스 휠 이 벤트 를 수신 하 는 디텍터 인터페이스 입 니 다.클릭 과 다른 마우스 이벤트 에 대해 서 는 Mouse Listener 를 사용 하 십시오.마우스 이동 및 드래그 에 대해 서 는 Mouse MotionListener 를 사용 하 십시오. * * /
button.addMouseWheelListener(new MouseWheelListener(){
	@Override
	public void mouseWheelMoved(MouseWheelEvent e) {
		/**         。**/
	}
});

마우스 감청 실례 는 다음 과 같다.
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
/**
 *     
 *          、  、    
 * 1.           
 * 2.              
 * 3.             
 */
public class TestMouseListener {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				MouseFrame frame = new MouseFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

class MouseFrame extends JFrame {
	public MouseFrame() {
		setTitle("      ");
		setSize(300, 200);
		MouseComponent component = new MouseComponent();
		add(component);
	}
}

class MouseComponent extends JComponent {
	private static final int SIDELENG = 10;
	private List<Rectangle2D> square;
	private Rectangle2D current;

	public MouseComponent() {
		square = new ArrayList<Rectangle2D>();
		current = null;

		addMouseListener(new MouseHandler());
		addMouseMotionListener(new MouseMotionHandler());
	}

	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		for (Rectangle2D r : square) {
			g2.draw(r);
		}
	}

	public Rectangle2D find(Point2D p) {
		for (Rectangle2D r : square) {
			if (r.contains(p))
				return r;
		}
		return null;
	}

	public void add(Point2D p) {
		double x = p.getX();
		double y = p.getY();
		current = new Rectangle2D.Double(x - SIDELENG / 2, y - SIDELENG / 2,
				SIDELENG, SIDELENG);
		square.add(current);
		repaint();
	}

	public void remove(Rectangle2D s) {
		if (s == null)
			return;
		if (s == current)
			current = null;
		square.remove(s);
		repaint();
	}

	private class MouseHandler extends MouseAdapter {

		@Override
		public void mousePressed(MouseEvent e) {
			current = find(e.getPoint());
			if (current == null)
				add(e.getPoint());
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			current = find(e.getPoint());
			if (current != null && e.getClickCount() >= 2)
				remove(current);
		}

	}

	private class MouseMotionHandler implements MouseMotionListener {

		@Override
		public void mouseMoved(MouseEvent e) {
			if (find(e.getPoint()) == null)
				setCursor(Cursor.getDefaultCursor());
			else
				setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		}

		@Override
		public void mouseDragged(MouseEvent e) {
			if (current != null) {
				int x = e.getX();
				int y = e.getY();
				current.setFrame(x - SIDELENG / 2, y - SIDELENG / 2, SIDELENG,SIDELENG);
				repaint();
			}
		}
	}
}

좋은 웹페이지 즐겨찾기