2

我对 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。JPanel 如何做到这一点?

提前致谢

4

2 回答 2

5

通常,当您想要通过覆盖 paintComponent() 方法进行自定义绘画时,您会扩展 JComponent。

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

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

于 2013-03-23T21:17:10.873 回答
1

虽然JComponent也继承自Container并且确实具有重新绘制适当大小和定位的子级的所有代码,但它没有任何调整它们大小或布局的能力。并且您既没有设置大小也没有设置位置,JButton因此默认情况下假定为零大小。

不同的JPanelFlowLayout,默认情况下,这个布局管理器将设置组件大小,主要取决于它们计算的首选大小。一般来说,JComponent直接用作容器是不常见的,使用JPanel.

于 2013-03-23T21:15:56.647 回答