2014-12-04 68 views
0

我想使用java制作Paint程序,我在jPanel中有三个事件来绘制我的线。 我的问题是,当我绘制新的线,第一个被删除(我认为在拖动的事件中的问题!)..等等。 注意,当鼠标拖动线路将被stucked鼠标 这里是我的事件代码:如何在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; 

回答

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); } 
+2

一个的paintComponent方法的第一行应*总是*是'super.paintComponent方法(克);'。 – VGR 2014-12-04 20:33:26

+0

如果使用'BufferedImage',我们可以将它显示在'JLabel'中,并在图像更新时调用'repaint()'。无需扩展'JPanel'。如果**使用**'paintComponent(Graphics)'然后'g.drawImage(mImg,0,0,null);''最​​好是'g.drawImage(mImg,0,0,this);' – 2014-12-05 00:44:20

3

getGraphics也不怎么画应该在Swing来完成,而不是覆盖面板paintComponent和油漆的成分状态存在。

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

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

参见Pinting in AWT and SwingPerforming Custom Painting更多detals

此外看一看this example一个想法

相关问题