您的位置:首页 > 移动开发 > Objective-C

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

2011-10-04 15:51 531 查看


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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐