Java 如何在JComponent中绘制JComponent?

Java 如何在JComponent中绘制JComponent?,java,swing,jpanel,jbutton,jcomponent,Java,Swing,Jpanel,Jbutton,Jcomponent,我对JComponent有奇怪的问题。我正在尝试创建自己的JComponent,因此我需要将我的JComponent组合在一起 我想在我的JComponent JDial中绘制JButton: public class JDial extends JComponent { private static final long serialVersionUID = 3364481508702147328L; public JDial() { JBut

我对JComponent有奇怪的问题。我正在尝试创建自己的JComponent,因此我需要将我的JComponent组合在一起

我想在我的JComponent JDial中绘制JButton:

public class JDial extends JComponent {
    private static final long serialVersionUID = 3364481508702147328L;

    public JDial() {        
        JButton b = new JButton("test");
        this.add(b);
    }
}   
但那只是画画而已。更有趣的是,这一个工作得很好:

public class JDial extends JPanel {
    private static final long serialVersionUID = 3364481508702147328L;

    public JDial() {        
        JButton b = new JButton("test");
        this.add(b);
    }
}
JPanel继承了JComponent并在内部绘制JButton。杰帕内尔是怎么变魔术的

提前感谢

虽然它也从
容器
中继承下来,并且有所有代码来重新绘制适当大小和位置的子对象,但它没有任何能力调整或布局它们。而且您没有为
JButton
设置大小和位置,因此默认情况下假定大小为零


不同的是,
JPanel
默认情况下是使用
FlowLayout
创建的,该布局管理器将主要根据计算出的首选尺寸来设置组件尺寸。通常,直接使用
JComponent
作为容器是不常见的,使用
JPanel

通常,当您想要通过重写paintComponent()方法进行自定义绘制时,您会扩展JComponent

如果您只想添加一组组件,那么应该使用JPanel


两者之间的区别在于,默认情况下,JPanel使用FlowLayout,因此它知道如何布局添加到其中的任何组件。要使JComponent像JPanel一样,您需要设置布局管理器并添加自定义绘制来绘制背景。

您的意思是
JButton
没有显示在您以前的代码中?我正在尝试创建我自己的JComponent,因此如果“您自己的JComponent”,我需要将我的JComponent组合在一起只是现有JComponent的容器,您不需要对其进行子类化?我应该在新创建的Jcomponent中包括哪些方法。假设我想创建自己的JLabel,有没有扩展JLabel类?