自定义JComponent大小默认为零?

时间:2012-12-02 03:52:33

标签: java swing user-interface layout jcomponent

我正在尝试将自定义可滚动JComponent添加到JFrame。

JScrollPane sp = new JScrollPane(hg);
frame.getContentPane().add(sp, BorderLayout.CENTER);

hg是我的自定义组件。

问题是我的自定义组件未显示。但是,如果我这样做:

hg.setBounds(0, 0, 800, 600);

然后会显示。但当然我不想明确设置大小。我希望它适合框架的中心。

在我的自定义JComponent类中,我重写了getPreferredSize():

private Dimension computePreferredSize() {
    return new Dimension((int) (this.getParent().getSize().width * scale),
            (int) (this.getParent().getSize().height * scale));
}

public Dimension getPreferredSize() {
    Dimension d = computePreferredSize();
    System.out.println("Dimension: " + d); // prints reasonable output: Dimension: java.awt.Dimension[width=1201,height=805]
    return d;
}

但这似乎没有任何影响。即使我直接返回固定维度:

public Dimension getPreferredSize() {
    return new Dimension(800, 600);
}

这也不起作用。

我还在我的ComponentUI的paint()方法中添加了println,但没有打印任何内容,因此我认为由于某种原因不会调用paint()。我认为原因是我的自定义组件的大小默认为零,我不知道如何让它调整自己的大小。

所以我的问题是:为什么默认情况下不显示我的JComponent,以及我应该怎么做以使其自动适合JFrame的中心?

谢谢!

1 个答案:

答案 0 :(得分:4)

在定义hg的类中,覆盖getPreferredSize()以返回组件的首选大小。可以找到示例herehere。讨论了基本原理和一些重要的警告here