8

我在玩 Java Swing,当谈到 JPanel 和 JComponent 时,我真的很困惑。根据 CoreJava Vol 1 (cay horstmann):

一些程序员喜欢扩展 JPanel 类,而不是扩展 JComponent。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 之间的区别。有没有一个简单的例子,我真的可以看到它?

任何帮助表示赞赏

4

1 回答 1

6

JComponent 不需要绘制它绑定的所有像素。它可能会留下一些透明的,以便您可以看到它后面的组件。

绘制所有像素需要 JPanel。

当然,如果您super.paintComponent(..)在任何一种情况下都不调用该方法,那么它们或多或少将是等价的,因为您随后放弃了 JPanel 将绘制整个面板的保证。

简而言之,区别在于已经存在的方法(即绘制组件)。

编辑:

使用 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);
    }
}
于 2013-10-01T17:39:16.680 回答