这需要对鼠标事件有一定的了解,首先实现鼠标按下和抬起两个事件,按下时记录矩形的起始位置,抬起时记录矩形的最终位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
另外最重要的部分是实现拖动痕迹的处理,需要实现的的鼠标拖动的事件(具体可以进行判断比如按住左键拖动,右键拖动等),还记得鼠标按下的事件记录的矩形其实位置吧,拖动事件需要记录当前矩形的位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
问题就来了,那就是有两个矩形了,这时在鼠标抬起的事件中删除一个拖动痕迹的矩形。
别放到拖拽事件里,这样当然一直画线,可以将事件放到点击里,判断是第二次点击的时候在画线不就可以画出一个方块了吗
1 继承Swing中的JPanel,而不是AWT中的Canvas。因为JPanel默认启用了双缓冲。
2 重写paintComponent方法而不是paint方法。绘制前需要清空画布,重写paintComponent方法时在开头调用父类的方法清空画布。
super.paintComponent(g);
public class MouseDragingExample {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Example");
frame.add(new PainterPane());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
static final class PainterPane extends JPanel {
/**
*
*/
private static final long serialVersionUID = -7281332353965961554L;
private int x;
private int y;
private int width;
private int height;
public PainterPane() {
setPreferredSize(new Dimension(800, 600));
MouseAdapter handle = new MouseHandle();
addMouseListener(handle);
addMouseMotionListener(handle);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawRect(x, y, width, height);
}
public class MouseHandle extends MouseAdapter {
@Override
public void mouseDragged(MouseEvent evt) {
width = evt.getX() - x;
height = evt.getY() - y;
repaint();
}
@Override
public void mousePressed(MouseEvent evt) {
x = evt.getX();
y = evt.getY();
}
@Override
public void mouseReleased(MouseEvent evt) {
width = evt.getX() - x;
height = evt.getY() - y;
repaint();
}
}
}
}
试试面板重绘。你这是因为拖动后没有重绘,才会导致保留之间的哼唧
每次画矩形之前先画背景。。
Graphics g=getGraphics();
//这里加个背景色的全屏矩形 g.fillRect(arg0, arg1, arg2, arg3)注意颜色 坐标要合乎全屏
g.drawLine(orgX,orgY, curX, orgY);
g.drawLine(orgX, orgY, orgX, curY);
g.drawLine(orgX, curY, curX, curY);
g.drawLine(curX, orgY, curX, curY);