如何在java中的jPanel中绘制时删除所有行?

时间:2014-12-04 20:13:23

标签: java swing

我试图使用java制作一个Paint程序,我在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;

2 个答案:

答案 0 :(得分:3)

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

paintComponent方法需要知道在调用时要绘制什么,因为它可能被调用任意次,很多次没有你的交互或知识。

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

有关更多信息,请参阅Pinting in AWT and SwingPerforming Custom Painting

另请查看this example的想法

答案 1 :(得分:0)

通常的做法是创建一个(块)大小的(缓冲)图像,填充背景颜色,然后在图像上绘制每个新行。在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); }