如何在JComponent中绘制JComponent?

时间:2013-03-23 20:47:09

标签: java swing jpanel jbutton jcomponent

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

我想在我的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如何做到这一点?

提前致谢

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

虽然JComponent也来自Container并且确实拥有重新映射正确大小和定位子项的所有代码,但它没有任何调整大小或布局它们的能力。并且您没有为JButton设置大小和位置,因此默认情况下假设为零。

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