我正在玩Java Swing,当谈到JPanel和JComponent时我真的很困惑。根据CoreJava Vol 1(cay horstmann):
而不是扩展JComponent,一些程序员喜欢扩展 JPanel类。 JPanel旨在成为可以包含的容器 其他组件,但也可以在其上绘画。有 只是一个区别。面板是不透明的,这意味着它是 负责绘制其边界内的所有像素。最简单的 实现这一目标的方法是使用背景颜色绘制面板, 通过在每个的paintComponent方法中调用super.paintComponent 面板子类:
class NotHelloWorldPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
. . . // code for drawing will go here
}
}
我知道什么是不透明的。他的意思是'面板是不透明的......负责绘制其边界内的所有像素'?如果我正确地阅读它,它说一个面板将在其边界内绘制自己的区域。不是JComponent也这样做吗?
底线是我看不出JPanel和JComponent之间的区别。有一个简单的例子,我真的可以看到它吗?
感谢任何帮助
答案 0 :(得分:6)
不需要JComponent绘制其绑定的所有像素。它可能会保留一些透明度,因此您可以看到它背后的组件。
需要JPanel来绘制所有像素。
当然,如果你在任何一种情况下都没有调用super.paintComponent(..)
方法,那么它们或多或少都是等价的,因为你抛弃了JPanel将绘制整个面板的保证。< / p>
简而言之,区别在于已经存在的方法(即绘画组件)。
编辑:
使用JComponent实现的球类示例如下所示:
(这不适用于JPanel,因为JPanel是不透明的,并且球将具有方形背景。你不能调用super.paintComponent
,但作为一般规则你总是应该,或者你打破了什么组件确实是。如果我将JPanel传递给某个东西,他们希望它是一个JPanel,而不是一个像JComponent一样被攻击的JPanel)
public class Ball extends JComponent
{
public Ball(int x, int y, int diameter)
{
super();
this.setLocation(x, y);
this.setSize(diameter, diameter);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(0, 0, width, height);
}
}