Java Swing - JPanel和JComponent的区别

8
我正在使用Java Swing,当涉及到JPanel和JComponent时感到非常困惑。根据《CoreJava第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
  }
}

我知道什么是opaque。他所说的“面板不透明...负责绘制其范围内所有像素”是什么意思?如果我理解正确,它表示面板将在其边界内绘制自己的区域... JComponent也是这样做的,不是吗?
总之,我看不出JPanel和JComponent之间的区别。有没有简单的示例可以真正看到它们之间的区别?
感谢任何帮助。

JLabel是一个JComponent,用于呈现文本,包裹文本的整个框是透明的。正如你所说,JPanel是旨在作为容器的JComponent,但有些JComponent不允许其他元素进入,比如JLabel、JMenuItem等。一些使用setComponent,一些使用addComponent(容器)。因此,JLabel是一个JComponent的例子,它不会绘制整个框。 - porfiriopartida
请注意,正如Java教程所引用的此处(问题3,第1点),JPanel并不总是Opaque。因此最好明确设置它 :-) - nIcE cOw
@nIcEcOw 我认为最好明确设置它,如果类的正确性取决于它。否则最好让它保持Laf。毕竟这就是外观和感觉的作用。 - Cruncher
@Cruncher:这取决于您可以留在LaF上的内容,例如Nimbus本身就很容易出现错误。因此,我更喜欢不使用这种可能会导致令人讨厌的行为的外观和感觉(Look And Feels)。 - nIcE cOw
1
@nIcEcOw 我认为我们在争论同一个观点 :) - Cruncher
1个回答

7

JComponent不需要绘制其边界框中的所有像素。它可以保留一些透明像素,以便您可以看到其后面的组件。

JPanel需要绘制其边界框中的所有像素。

当然,如果在任一情况下都不调用super.paintComponent(..)方法,则它们将更或多或少相等,因为您放弃了JPanel将会绘制整个面板的保证。

简而言之,区别在于已经存在的方法(即paint component)。

编辑:

使用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);
    }
}

1
我需要例子...我只是看不到它。图片胜过千言万语。 - yapkm01
编辑并附上一个例子 - Cruncher
@yapkm01 注意,对于这个特定的例子,我认为您需要在容器上设置一个空布局,以便传递的位置能够正常工作。虽然我不是布局专家。 - Cruncher
我测试了使用Ball扩展JPanel和JComponent,它们的行为都是相同的。没有区别。 - yapkm01
我感到沮丧,因为我很难理解jcomponent/jpanel的基础知识。请查看我的其他问题。谢谢。 - yapkm01
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接