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?
不透明度处理的差异不是唯一的因素.
查看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,但由于可访问性的额外考虑因素,我可能会对交互式组件进行三次考虑.
干杯,
这是正确的心理。如果你检查它的来源JPanel并没有触及不透明。然而,大多数 PL&F 的大多数版本确实设置了 opaque 属性。他们可以随机设置其他属性。
GTK PL&F 的早期版本没有设置JPanel. 它被改变了,显然是为了性能,尽管也许劣质的 Swing 程序员使用JPanel不当可能是一个因素。
子类化的正当理由很少JPanel。不要这样做。
| 归档时间: |
|
| 查看次数: |
1470 次 |
| 最近记录: |