2012-12-02 86 views
1

我想添加一个自定义的可滚动JComponent到JFrame。自定义JComponent大小默认为零?

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的中心?

谢谢!

+0

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

安德鲁,谢谢你告诉我! –

+1

你提到了一个'paint()'方法。有两件事情:(1)最好重写'paintComponent'而不是'paint',因为它可以让Swing绘制边框和东西; (2)应该是'paint(Graphics g)',对吗?如果不是,那么'paint()'永远不会被调用。这就是为什么[@Override](http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html)有用。 – wchargin

回答

4

在定义hg的类中,覆盖getPreferredSize()以返回您的组件的首选大小。例子可以发现herehere。基本原理和一些重要的注意事项在here讨论。

+1

根据内容,还可以考虑实现['Scrollable'](http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#scrollable)。 – trashgod

+0

你好trashgod,感谢您的及时回应!但是,我已经覆盖该方法,但它不起作用。详情请看我编辑的问题。我也实现了Scrollable。 –

+0

它在引用的例子中工作吗?你使用['pack()'](http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html)和['invokeLater()'](http://docs.oracle。 COM/JavaSE的/教程/ uiswing /并发/ initial.html)?绝对使用'@ Override'。请修改您的问题以包含您的[sscce](http://sscce.org/)。 – trashgod