在JPanel和JComponent上绘画有什么好处?

Pau*_*tha 10 java swing paint jcomponent jpanel

所以在最近的一个回答中,有人评论过此(关于绘画):

"这可能是90%Swing程序员的某种疾病:当他们制作自己的组件时,他们总是扩展JPanel而不是JComponent.为什么?"

我仍然是编程方面的新手,所以我认为现在称自己为Swing程序员为时尚早,因为我尚未找到自己的位置.但压倒一切JPanel只是我教的方式.所以我开始找到"为什么?"的答案.评论者的问题.这些是我找到的一些答案.


背景画是主要的区别.JComponent类不绘制其背景,因此您必须在重写的paintComponent方法中绘制背景.相比之下,JPanel有一个不透明的背景,可以通过调用它的paintComponennt方法来绘制.


一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:


如果将opaque属性设置为true ...那么Swing绘图系统不必浪费时间尝试在组件后面进行绘制,从而提高性能.


我认为最后一句话真的解释得最好.但是,除了透明度外,还有其他有益的原因"90%的Swing程序员都有这样的疾病"延伸JPanel,而不是JComponent

reg*_*win 5

不透明度处理的差异不是唯一的因素.

查看JPanel源代码有帮助,因为它只有~100行.

所有构造函数最终都会调用此构造函数.不透明度和双缓冲默认为true.默认的LayoutManager是FlowLayout,您可能想要也可能不想要.

public JPanel(LayoutManager layout, boolean isDoubleBuffered) {
        setLayout(layout);
        setDoubleBuffered(isDoubleBuffered);
        setUIProperty("opaque", Boolean.TRUE);
        updateUI();
}
Run Code Online (Sandbox Code Playgroud)

Loy等人在O'Reilly的Java Swing第2版中建议扩展JComponent以获得真正的自定义组件(p.1333),但也提到需要考虑UI委托.JPanel处理它自己的具体AccessibleContext,而扩展JComponent的类返回null.

对于只读的可视组件,我通常会扩展JComponent,但由于可访问性的额外考虑因素,我可能会对交互式组件进行三次考虑.

干杯,


Tom*_*ine 4

这是正确的心理。如果你检查它的来源JPanel并没有触及不透明。然而,大多数 PL&F 的大多数版本确实设置了 opaque 属性。他们可以随机设置其他属性。

GTK PL&F 的早期版本没有设置JPanel. 它被改变了,显然是为了性能,尽管也许劣质的 Swing 程序员使用JPanel不当可能是一个因素。

子类化的正当理由很少JPanel。不要这样做。

  • +1但是这样的论点是“JComponent”更通用并且是子类化的正确目标,而“JPanel”太具体并且子类化它只是一个黑客?您是否同意您的自定义组件参与 PLAF 框架通常没有意义? (2认同)