使用repaint()方法绘制图形时,如何避免删除之前的图形?

3

我有一个绘制方法,希望在调用repaint()后,保留drawLine在屏幕上。fillOval会移动,这没问题。但是我希望drawLine只是在另一个位置重新绘制而不被删除。

public void paint(Graphics g) {
    super.paint(g);

    g.setColor(Color.RED);
    g.drawLine(x, y, x+10, y+10);
    g.setColor(Color.BLACK);
    g.fillOval(x - radius, y - radius, radius * 2, radius * 2);

}

你的意思是你想保留原始的drawline,并在其新位置上添加一个新的drawline吗?还是你只是希望在重绘后以其新位置重新绘制相同的线条? - OnResolve
5
自定义绘制是通过覆盖paintComponent()方法来完成的,而不是paint()方法。为什么一些人还在使用paint()方法进行绘制? - camickr
@camickr 的简单答案是:所有的 Java Swing 示例库都可以找到,没有任何例外,例如 http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Catalog0261__2D-Graphics.htm 等。 - mKorbel
那个网站应该被禁止,因为它会误导人们的编程问题 :) - camickr
2个回答

3

不错的答案,即使我仍然认为关于super和dispose的部分+1。 - mKorbel

2

您可以将每条线的xy存储在List中。在每次repaint()时,只需重新绘制List中存在的所有线条即可。


1
这种方法似乎是多余的。为什么不仅限制您重新绘制的区域,而不是重新绘制所有内容并进行不必要的簿记? - mre
@mre 这真的取决于他想做什么。如果下一次重绘时,他想将这些线条平移10个像素,那么这并不是多余的。 - Adel Boutros
2
虽然理论上您可以限制重新绘制的区域,但这种方式更加健壮。如果窗口部分被遮挡,因为另一个重叠的窗口被选中或最小化了窗口,则可能需要重新绘制整个应用程序屏幕。那么接下来呢?您必须进行完全的重新绘制。然后,您将需要所有的簿记来重新创建已经在屏幕上的内容。 - Jessica Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接