我一直认为需要Canvas或JPanel来将图形放在JFrame上,但我之前看过一个视频,其中的人正在使用paint(图形g)同时扩展JFrame并且没有做了一个面板或画布。如果是这种情况,为什么人们会为制作Canvas或JPanel而烦恼呢?
答案 0 :(得分:4)
JFrame
从Frame
延伸,Window
从Container
延伸,从Component
延伸,从定义paint
的{{1}}延伸。< / p>
如果是这种情况,为什么人们会为制作Canvas或JPanel而烦恼?
要回答这个问题,您需要更好地了解JFrame
(以及基于窗口的类)。
JFrame
实际上是一个复合组件,也就是说,它由许多其他组件组成,这些组件提供了窗口的核心功能
这意味着,如果你覆盖paint
并在框架上执行自定义绘画,你很可能会在子组件上绘制或子组件将在其上绘制,并且由于油漆子系统工作,任何时候都会这样做,没有框架的油漆方法被调用。
框架包括其可用区域内的窗户装饰。这意味着“可视”区域实际上小于框架的定义区域。
这也是为什么建议使用pack
代替setSize
这意味着如果你覆盖paint
,你实际上可以在窗户装饰下画画(是的,这种情况一直都在发生,我们已经厌倦了回答)
contentPane
的{{1}}负责处理此问题,因为它位于可见区域内。
顶级容器(如JFrame
)不是双缓冲的,因此,即使您克服了上述所有问题,您也会获得闪烁的更新。当然你可以“设计”你自己的双缓冲算法,但在Swing(即JFrame
),它是免费的,所以为什么要打扰
作为一般性建议,我们通常不鼓励从JPanel
(或其他顶级容器)扩展,因为它会将您锁定到单个用例中并阻止重复使用的可能性。
另一方面,如果你使用JFrame
,你可以随时将它添加到你想要的容器中