16. 3. 12. 鼠标拖拽及滑轮图形Move and scale graphical objects with a mouse on the panel

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Rectangle2D;

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


public class MouseMoveScale extends JPanel{
	private Rectangle2D.Float myRect = new Rectangle2D.Float(50,50,50,50);
	
	MovingAdapter ma = new MovingAdapter();
	
	public MouseMoveScale(){
		addMouseMotionListener(ma);
		addMouseListener(ma);
		addMouseWheelListener(new ScaleHandler());
	}
	
	public void paint(Graphics g){
		super.paint(g);
		Graphics2D g2d = (Graphics2D)g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		//文本抗锯齿提示  key_text_antialiasing
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g2d.setColor(Color.magenta);
		g2d.fill(myRect);
	}
	
	class MovingAdapter extends MouseAdapter{
		private int x;
		private int y;
		public void mousePressed(MouseEvent e){//按下事件
			x = e.getX();//鼠标的点就是它的点
			y = e.getY();
		}
		
		public void mouseDragged(MouseEvent e){//拖拽事件
			int dx = e.getX() - x;
			int dy = e.getY() - y;
			
			/**
			 * 返回一个高精度的、比 getBounds 方法更准确的 Shape 边界框。
			 * 注意,不保证返回的 Rectangle2D 是包围 Shape 的最小边界框,
			 * 只保证 Shape 完全位于指示的 Rectangle2D 中。
			 * 此方法返回的边界框通常比 getBounds 方法返回的更紧密,
			 * 而且永远不会因为溢出问题而出错,因为返回值可以是一个使用双精度值存储尺寸的 Rectangle2D 实例。 
			 */
			if(myRect.getBounds2D().contains(x,y)){
				myRect.x += dx;
				myRect.y += dy;
				repaint();
			}
			x += dx;
			y += dy;
		}
	}
	
	class ScaleHandler implements MouseWheelListener{//鼠标滚轮事件的侦听器接口

		public void mouseWheelMoved(MouseWheelEvent e) {
			int x = e.getX();
			int y = e.getY();
			if(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL){
				if(myRect.getBounds2D().contains(x,y)){//鼠标的位置在方块之内有效
					//返回鼠标滚轮旋转的“喀哒声”的次数。 
//如果鼠标滚轮向上/远离用户方向旋转,则为负值;如果鼠标滚轮向下/朝向用户方向旋转,则为正值
					float amount = e.getWheelRotation() * 5f;//amount:总计
					myRect.width += amount;
					myRect.height += amount;
					repaint();
				}
			}
		}
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Moving and Scaling");
		MouseMoveScale m = new MouseMoveScale();
		/**setDoubleBuffered()方法:
		 * 设置此组件是否应该使用缓冲区进行绘制。如果设置为 true,则此组件的所有绘制将在一个离屏绘制缓冲区内完成。
		 * 然后将该离屏绘制缓冲区复制到屏幕上。如果缓冲了某个 Component,并且还缓冲了它的某个祖先,
		 * 则将使用该祖先缓冲区。 
		 */
		m.setDoubleBuffered(true);
		frame.add(m);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setSize(300, 300);
	    frame.setLocationRelativeTo(null);
	    frame.setVisible(true);
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值