有多种方法可以解决您的问题。@MattiasF和@MadProgrammer是正确的:Swing在做它应该做的事情。您的
paintComponent方法应该重绘整个场景,而不是添加到前一个场景。
到目前为止,建议的解决方案会导致应用程序执行矢量图形处理:您正在记住原始的绘制操作,并且在每个绘制上都执行每个绘制操作(Java2D对其进行了一些优化,因为它实际上不会重绘区域。当前在屏幕上不可见的区域,但要弄清楚哪些区域是可见的,哪些区域不可见,也需要花费时间。
优点是,如果需要更大或更小的图像,则可以完美地缩放绘图操作。缺点是,一旦存储了许多绘图操作,它的速度可能会变慢,并且无法(轻松)进行位图操作。
另一种方法是位图方法。您可以在内存中建立绘图的位图,然后使用该
paintComponent方法将位图绘制到屏幕上。
优点是通常更快。它还允许位图操作,并且针对此模型进行编程通常也更容易,因为您可以在需要时进行绘制,而不是在内存中构建一系列绘制操作。缺点是它使用更多的内存(直到您执行许多绘图操作为止),并且您无法再完美地缩放图像。
为了使您的工作,例如与保存在内存中的位图,添加等领域
image,并
imageGraphics为您的阶级,并更换您的鼠标监听
ml,以及在
paintComponent用下面的代码的方法:
private BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);private Graphics2D imageGraphics = image.createGraphics();public class ml extends MouseAdapter implements MouseMotionListener, MouseListener { public void mousePressed(MouseEvent e) { end = e.getPoint(); } public void mouseDragged(MouseEvent e) { start = end; end = e.getPoint(); imageGraphics.setColor(c); imageGraphics.setStroke(new BasicStroke(5)); imageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); imageGraphics.drawLine(start.x, start.y, end.x, end.y); repaint(); } public void mouseReleased(MouseEvent e) { start = null; end = null; }}public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.drawImage(image, null, 0, 0);}您将立即看到缩放问题。位图缓冲区为500x500像素,超出此范围的任何内容都不会绘制。这基本上与Microsoft绘画的工作方式相同:开始绘制之前,您需要了解画布的大小。



