2012-12-02 83 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