Java Swing使用鼠标单击和拖动绘制线条

b4qexyjb  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(163)

我想再提一个以前问过的问题:当鼠标移动时java画线
“我想在我的应用程序中添加一个功能,允许用户在开始位置单击鼠标并在结束位置释放鼠标来绘制直线,直线应随着鼠标的移动而移动,直到最后释放鼠标;类似于使用Microsoft Paint应用程序绘制线的方式。
如何实现这一点,使线在移动时重新绘制,而不重新绘制可能已经在该矩形区域中绘制的其他内容?”

问题是:如何在旧线仍然存在的情况下绘制多条线?

这是我能用的代码,但是一旦你画了一行新的代码,前面的代码就会被删除:

public static void main(String args[]) throws Exception {
    JFrame f = new JFrame("Draw a Red Line");
    f.setSize(300, 300);
    f.setLocation(300, 300);
    f.setResizable(false);
    JPanel p = new JPanel() {
        Point pointStart = null;
        Point pointEnd   = null;
        {
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    pointStart = e.getPoint();
                }

                public void mouseReleased(MouseEvent e) {
                    pointStart = null;
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    pointEnd = e.getPoint();
                }

                public void mouseDragged(MouseEvent e) {
                    pointEnd = e.getPoint();
                    repaint();
                }
            });
        }
        public void paint(Graphics g) {
            super.paint(g);
            if (pointStart != null) {
                g.setColor(Color.RED);
                g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
            }
        }
    };
    f.add(p);
    f.setVisible(true); 
}
qhhrdooz

qhhrdooz1#

这是我能用的代码,但是一旦你画了一行新的代码,前面的代码就会被删除:
有两种常见的方法:
1.保留一个要绘制的对象的ArrayList,然后在组件每次需要重画自己时,paintComponent()方法重画所有对象
1.在BufferImage上绘制,然后只绘制BufferedImage。
请查看Custom Painting Approaches以获得这两种方法的工作示例。

omhiaaxx

omhiaaxx2#

刚刚设置鼠标释放
点开始= e.获取点,而不是点开始=空。
不需要任何列表或类似的东西,当您将其设置为null时,它将从头开始并删除最后一个列表

相关问题