Java Swing通过鼠标单击并拖动来绘制线条

时间:2016-10-26 04:30:35

标签: java swing mouseevent line paintcomponent

我想带回一个之前提出过的问题:java draw line as the mouse is moved

“我想在我的应用程序中添加一个功能,允许用户通过在起始位置单击鼠标并在结束位置释放它来绘制直线。当鼠标移动时,线条应移动直到它为止最终发布;类似于使用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); 
}

1 个答案:

答案 0 :(得分:3)

  

这是适用于我的代码,但是在您绘制新代码后,上一行会被删除:

有两种常见的方法:

  1. 保持要绘制的对象的ArrayList。然后每次组件需要重新绘制自己时,paintComponent()方法重新绘制所有对象

  2. 绘制到BufferImage上,然后绘制BufferedImage。

  3. 查看Custom Painting Approaches以获取这两种方法的工作示例。