JFrame延伸自Frame,延伸自Window,延伸自Container,延伸自Component定义paint。
如果是这种情况,为什么人们要费心制作 Canvas 或 JPanel?
要回答这个问题,您需要更好地了解JFrame(和基于窗口的类)。
JFrame 实际上是一个复合组件,也就是说,它由许多提供窗口核心功能的其他组件组成
这意味着,如果您paint在框架上覆盖并执行自定义绘画,则很可能您将在子组件上进行绘画,或者子组件将在其上进行绘画,并且由于绘画子系统的工作方式,任何情况下都会这样做没有调用框架的paint方法的时间。
框架包括其可用区域内的窗户装饰。这意味着“可视”区域实际上小于框架的定义区域。
这也是为什么建议使用pack而不是setSize
这意味着如果你覆盖paint你实际上可以在窗户装饰下绘画(是的,这种情况一直发生,我们已经厌倦了回答)
该contentPane的JFrame,因为它的可视区域内布置注意到了这一问题。
顶级容器,例如JFrame不是双缓冲的,因此,即使您克服了上述所有问题,您也会获得闪烁的更新。当然你可以“设计”你自己的双缓冲算法,但在 Swing(即JPanel)中,它是免费的,所以为什么要麻烦
作为一般建议,我们通常不鼓励从JFrame(或其他顶级容器)扩展,因为它会将您锁定在单个用例中并防止重用的可能性。
另一方面,如果您使用 a JPanel,则可以随时将其添加到您想要的任何容器中