您不需要 Canvas 或 JPanel 来绘制?

0 java graphics canvas jpanel jframe

我一直认为在 JFrame 上放置图形需要使用 Canvas 或 JPanel,但是我之前看过一个视频,其中该人在扩展 JFrame 的同时使用油漆(图形 g)并且没有制作面板或帆布。如果是这种情况,为什么人们要费心制作 Canvas 或 JPanel?

Mad*_*mer 7

JFrame延伸自Frame,延伸自Window,延伸自Container,延伸自Component定义paint

如果是这种情况,为什么人们要费心制作 Canvas 或 JPanel?

要回答这个问题,您需要更好地了解JFrame(和基于窗口的类)。

复杂的

JFrame 实际上是一个复合组件,也就是说,它由许多提供窗口核心功能的其他组件组成

JRootPane

这意味着,如果您paint在框架上覆盖并执行自定义绘画,则很可能您将在子组件上进行绘画,或者子组件将在其上进行绘画,并且由于绘画子系统的工作方式,任何情况下都会这样做没有调用框架的paint方法的时间。

装饰

框架包括其可用区域内的窗户装饰。这意味着“可视”区域实际上小于框架的定义区域。

这也是为什么建议使用pack而不是setSize

这意味着如果你覆盖paint你实际上可以在窗户装饰下绘画(是的,这种情况一直发生,我们已经厌倦了回答)

装饰下的绘画

我如何在中间设置的屏幕截图

contentPaneJFrame,因为它的可视区域内布置注意到了这一问题。

双缓冲

顶级容器,例如JFrame不是双缓冲的,因此,即使您克服了上述所有问题,您也会获得闪烁的更新。当然你可以“设计”你自己的双缓冲算法,但在 Swing(即JPanel)中,它是免费的,所以为什么要麻烦

锁定

作为一般建议,我们通常不鼓励从JFrame(或其他顶级容器)扩展,因为它会将您锁定在单个用例中并防止重用的可能性。

另一方面,如果您使用 a JPanel,则可以随时将其添加到您想要的任何容器中