我试图使用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;
答案 0 :(得分:3)
getGraphics
不是如何在Swing中完成绘画,而是覆盖面板paintComponent
并在那里绘制组件状态。
paintComponent
方法需要知道在调用时要绘制什么,因为它可能被调用任意次,很多次没有你的交互或知识。
一种方法是构建List
个形状或Point
,然后每次调用paintComponent
时都可以循环绘制。这样做的好处是你可以根据需要删除这些形状/点。
有关更多信息,请参阅Pinting in AWT and Swing和Performing 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); }