为什么覆盖像paint()
这样JFrame
的{{1}}方法真是太可怕了?它会引起什么样的问题?
答案 0 :(得分:4)
有很多原因,但很多原因还取决于您使用的工具包。
一般来说,在顶级容器上使用paint
可将您锁定到给定容器(即Frame
或Applet
)。这也会影响您重用组件的能力,因为窗口无法添加到另一个窗口。
另一个问题是大多数帧都添加了边框(帧边框通常包含标题和帧控件)。绘制到顶级容器时不考虑这些插入,这意味着如果在位置0x0处绘制,则将在框架的标题栏下绘制。
在Swing下,顶级容器不是双缓冲的。这意味着重新绘制往往会闪烁,因为每个元素都直接渲染到图形层个体,而不是一次性绘制。
同样在Swing中,顶级容器由JRootPane
控制,该容器在容器顶部放置内容窗格(如果您使用它,则菜单栏)。这意味着您的绘画工作可能会被这些组件覆盖。
我还要添加(在摇摆下)组件绘制层/链更灵活,允许您有机会在不同的层上绘制,尽管一般来说,您应该使用paintComponent
。