在java中使用jPanel绘图时,如何删除所有行?

在java中使用jPanel绘图时,如何删除所有行?,java,swing,Java,Swing,我正在尝试使用java制作一个绘画程序,我在jPanel中有三个事件来画我的线。 我的问题是,当我画新线时,第一条线被删除了(我认为这是拖拽事件中的问题!)。。等等 请注意,当拖动鼠标时,线将被固定到鼠标上 这是我的活动代码: private void jPanel1MousePressed(java.awt.event.MouseEvent evt) { g1=(Graphics2D) jPanel1.get

我正在尝试使用java制作一个绘画程序,我在jPanel中有三个事件来画我的线。 我的问题是,当我画新线时,第一条线被删除了(我认为这是拖拽事件中的问题!)。。等等 请注意,当拖动鼠标时,线将被固定到鼠标上 这是我的活动代码:

  private void jPanel1MousePressed(java.awt.event.MouseEvent evt) {                                     
    g1=(Graphics2D) jPanel1.getGraphics(); 
    p1=jPanel1.getMousePosition();
}                                    
    JLayer lpane;

    private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {                                     
     if(p1!=null){ 
         lpane = new JLayer();
         jPanel1.add(lpane, BorderLayout.CENTER);
         lpane.setBounds(0, 0, 328, 257);

         g2=(Graphics2D) lpane.getGraphics();
    l=new Line(p1.x,p1.y,jPanel1.getMousePosition().x,jPanel1.getMousePosition().y);
    l.draw(g2); 
    //lpane.repaint();
    lpane.setVisible(false);
    lpane.removeAll();
    lpane.disable(); jPanel1.remove(lpane);
    }
}                                    

private void jPanel1MouseReleased(java.awt.event.MouseEvent evt) {                                      
    if(p1!=null)
   {  
       g1=(Graphics2D) jPanel1.getGraphics();
        p2=jPanel1.getMousePosition();
        l=new Line(p1.x,p1.y,p2.x,p2.y);
        g1.setColor(Color.red);
      l.draw(g1);
     p1=null;
   }
}                                     
Graphics2D g1,g2; Point p1=null,p2=null; Line l;

通常的方法是创建一个与组件大小相同的(缓冲)图像,填充背景色,然后在图像上绘制每条新线。在paintComponent方法中,您只需调用g.drawImage(…)

在您的面板中:

public void paintComponent(Graphics g) {
    if (mSizeChanged) {
        handleResize();
    }
    g.drawImage(mImg, 0, 0, null);
}
在您的MouseMotionListener中:

    public void mouseDragged(MouseEvent me) {
        Graphics g = mImg.getGraphics();
        Point p = me.getPoint();
        g.drawLine(mLastPoint.x, mLastPoint.y, p.x, p.y); }

通常的方法是创建一个与组件大小相同的(缓冲)图像,填充背景色,然后在图像上绘制每条新线。在paintComponent方法中,您只需调用g.drawImage(…)

在您的面板中:

public void paintComponent(Graphics g) {
    if (mSizeChanged) {
        handleResize();
    }
    g.drawImage(mImg, 0, 0, null);
}
在您的MouseMotionListener中:

    public void mouseDragged(MouseEvent me) {
        Graphics g = mImg.getGraphics();
        Point p = me.getPoint();
        g.drawLine(mLastPoint.x, mLastPoint.y, p.x, p.y); }

通常的方法是创建一个与组件大小相同的(缓冲)图像,填充背景色,然后在图像上绘制每条新线。在paintComponent方法中,您只需调用g.drawImage(…)

在您的面板中:

public void paintComponent(Graphics g) {
    if (mSizeChanged) {
        handleResize();
    }
    g.drawImage(mImg, 0, 0, null);
}
在您的MouseMotionListener中:

    public void mouseDragged(MouseEvent me) {
        Graphics g = mImg.getGraphics();
        Point p = me.getPoint();
        g.drawLine(mLastPoint.x, mLastPoint.y, p.x, p.y); }

通常的方法是创建一个与组件大小相同的(缓冲)图像,填充背景色,然后在图像上绘制每条新线。在paintComponent方法中,您只需调用g.drawImage(…)

在您的面板中:

public void paintComponent(Graphics g) {
    if (mSizeChanged) {
        handleResize();
    }
    g.drawImage(mImg, 0, 0, null);
}
在您的MouseMotionListener中:

    public void mouseDragged(MouseEvent me) {
        Graphics g = mImg.getGraphics();
        Point p = me.getPoint();
        g.drawLine(mLastPoint.x, mLastPoint.y, p.x, p.y); }

getGraphics
不是在Swing中绘制的方式,而是覆盖面板
paintComponent
并在那里绘制组件状态

paintComponent
方法需要知道无论何时调用它都要绘制什么,因为它可能会被调用任意次数、多次,而无需您的交互或知识

一种方法是建立一个形状或点的
列表,然后每次调用
paintComponent
时都可以循环绘制。这样做的好处是,您可以根据需要删除这些形状/点

有关详细信息,请参阅和


另请看一个想法

getGraphics
不是如何在Swing中进行绘制,而是覆盖面板
paintComponent
并在那里绘制组件状态

paintComponent
方法需要知道无论何时调用它都要绘制什么,因为它可能会被调用任意次数、多次,而无需您的交互或知识

一种方法是建立一个形状或点的
列表,然后每次调用
paintComponent
时都可以循环绘制。这样做的好处是,您可以根据需要删除这些形状/点

有关详细信息,请参阅和


另请看一个想法

getGraphics
不是如何在Swing中进行绘制,而是覆盖面板
paintComponent
并在那里绘制组件状态

paintComponent
方法需要知道无论何时调用它都要绘制什么,因为它可能会被调用任意次数、多次,而无需您的交互或知识

一种方法是建立一个形状或点的
列表,然后每次调用
paintComponent
时都可以循环绘制。这样做的好处是,您可以根据需要删除这些形状/点

有关详细信息,请参阅和


另请看一个想法

getGraphics
不是如何在Swing中进行绘制,而是覆盖面板
paintComponent
并在那里绘制组件状态

paintComponent
方法需要知道无论何时调用它都要绘制什么,因为它可能会被调用任意次数、多次,而无需您的交互或知识

一种方法是建立一个形状或点的
列表,然后每次调用
paintComponent
时都可以循环绘制。这样做的好处是,您可以根据需要删除这些形状/点

有关详细信息,请参阅和


还要看一看想法

paintComponent方法的第一行应该始终是
super.paintComponent(g)
。如果使用
buffereImage
我们可以在
JLabel
中显示它,并在更新图像时调用
repaint()
。无需扩展
JPanel
。如果使用
paintComponent(Graphics)
g.drawImage(mImg,0,0,null)
最好是
g.drawImage(mImg,0,0,this)
paintComponent方法的第一行应该始终是
super.paintComponent(g)
。如果使用
buffereImage
我们可以在
JLabel
中显示它,并在更新图像时调用
repaint()
。无需扩展
JPanel
。如果使用
paintComponent(Graphics)
g.drawImage(mImg,0,0,null)
最好是
g.drawImage(mImg,0,0,this)
paintComponent方法的第一行应该始终是
super.paintComponent(g)
。如果使用
buffereImage
我们可以在
JLabel
中显示它,并在更新图像时调用
repaint()
。无需扩展
JPanel
。如果使用
paintComponent(Graphics)
g.drawImage(mImg,0,0,null)
最好是
g.drawImage(mImg,0,0,this)
paintComponent方法的第一行应该始终是
super.paintComponent(g)
。如果使用
buffereImage
我们可以在
JLabel
中显示它,并在更新图像时调用
repaint()
。无需扩展
JPanel
。如果使用
paintComponent(Graphics)
g.drawImage(