paintComponent() vs paint() 和 JPanel vs Canvas in a paintbrush-type GUI

2022-09-03 04:06:57

我从这个这个和这篇文章中得到了一些有趣的想法和批评(有关所讨论的GUI代码,请参阅上一篇文章)。尽管如此,我仍然对某些事情感到困惑。主要是,显示用户引入的图形的最便宜的方式是什么?

更具体地说,我使用了类中的方法,方法是在方法中将此类的对象与方法(并相应地)一起创建。paintComponent()JPanelMouseDragged()paintComponent(getGraphics())AuxClass2AuxClass1

显然,使用而不是坏主意,我怀疑与内存使用有关。此外,每次用户拖动鼠标时调用 也就是一个坏主意。getGraphics()paintComponent()repaint()AuxClass2

此外,JPanel vs Canvas(即swing vs awt)有点令人困惑。使用什么以及何时使用?

我一直在尝试找到解决方法,但没有找到,特别是对于该方法:如何将图形添加到面板中?getGraphics()


答案 1

重与轻

基本上,重量级组件链接到自己的本机对等体,其中轻量级组件共享一个共同的本机对等体。

一般来说,混合重量较轻的组件不是一个好主意,因为z顺序存在问题,并且根据我的经验(即使现在应该更好),可能会出现一些绘画问题。

这就是为什么你不鼓励使用这个类的原因,可能是因为你试图把它放在一个轻量级的组件上......我想Canvas

控制的错觉

对于Swing API的新手来说,最大的问题之一是错觉,你对绘画过程有某种控制,而你没有。接受它更容易。

您可以做的最好的事情是请求重绘管理器尽早执行更新。

此外,不保证调用返回非空值。getGraphics

事物的正确顺序

paintpaintComponent

这里的问题是做一些重要的工作,打电话只是其中之一。paintpaintComponent

在 Swing 中,我们非常鼓励在要执行自定义绘制时使用,这通常是组件上的最低级别,并且在绘制子组件之前调用。paintComponent

如果你覆盖,然后在调用后绘画,你最终会在所有东西之上绘画,这并不总是想要的结果paintGraphicssuper.paint

即使是这样,子组件也可以独立于其父容器进行绘制,从而使绘制“覆盖”您可能已添加的任何绘画效果

有用的链接

离别的念头

只有实际添加到附加到本机对等体的组件的组件才会调用方法。因此,尝试绘制到尚未添加到容器中的组件是相当没有意义的......paint


答案 2

..画笔式图形用户界面..

使用 a 作为绘画表面。在 .将标签放在面板中央的 .BufferedImageJLabelJScrollPane

根据需要调用,但完成后请记住,然后调用 。bufferedImage.getGraphics()dispose()label.repaint()

始终使用 Swing 组件,并且不要覆盖任何内容。

下面是使用图像作为绘制表面的示例

这是一个更好的

我没有说屏幕截图更好,而是代码更好。;)


推荐