java中鼠标拖动画矩形怎么消除拖动的痕迹,最后只得到一个矩形框

2024年12月02日 13:01
有5个网友回答
网友(1):

  这需要对鼠标事件有一定的了解,首先实现鼠标按下和抬起两个事件,按下时记录矩形的起始位置,抬起时记录矩形的最终位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。

  另外最重要的部分是实现拖动痕迹的处理,需要实现的的鼠标拖动的事件(具体可以进行判断比如按住左键拖动,右键拖动等),还记得鼠标按下的事件记录的矩形其实位置吧,拖动事件需要记录当前矩形的位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
  问题就来了,那就是有两个矩形了,这时在鼠标抬起的事件中删除一个拖动痕迹的矩形。

网友(2):

别放到拖拽事件里,这样当然一直画线,可以将事件放到点击里,判断是第二次点击的时候在画线不就可以画出一个方块了吗

网友(3):

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

网友(4):

试试面板重绘。你这是因为拖动后没有重绘,才会导致保留之间的哼唧

网友(5):

每次画矩形之前先画背景。。

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