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

本文介绍了一个Java程序,使用Swing组件创建了一个面板,通过鼠标操作实现实时缩放和移动一个矩形图形。程序利用了Graphics2D类进行图形绘制,并通过MouseAdapter实现了鼠标事件监听,包括鼠标移动、按下和滚轮滚动。动态调整图形位置和大小,展示了Java图形编程的基本技巧。

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); } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值