你不需要Canvas或JPanel来绘制?

时间:2018-06-11 00:22:13

标签: java canvas graphics jframe jpanel

我一直认为需要Canvas或JPanel来将图形放在JFrame上,但我之前看过一个视频,其中的人正在使用paint(图形g)同时扩展JFrame并且没有做了一个面板或画布。如果是这种情况,为什么人们会为制作Canvas或JPanel而烦恼呢?

1 个答案:

答案 0 :(得分:4)

JFrameFrame延伸,WindowContainer延伸,从Component延伸,从定义paint的{​​{1}}延伸。< / p>

  

如果是这种情况,为什么人们会为制作Canvas或JPanel而烦恼?

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

并发

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

JRootPane

这意味着,如果你覆盖paint并在框架上执行自定义绘画,你很可能会在子组件上绘制或子组件将在其上绘制,并且由于油漆子系统工作,任何时候都会这样做,没有框架的油漆方法被调用。

装饰品

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

这也是为什么建议使用pack代替setSize

的原因

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

Painting under the decorations

How can I set in the midst?

拍摄的屏幕截图

contentPane的{​​{1}}负责处理此问题,因为它位于可见区域内。

双缓冲

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

锁定在

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

另一方面,如果你使用JFrame,你可以随时将它添加到你想要的容器中