2012-11-26 37 views
0

我有這段代碼,其中Canvas是我製作的類,它擴展了JPanel它擁有一個圖像。但是當我使用它時,它將畫布放在JScrollPane之上,但在它後面。爲什麼這樣做?JPanel放置在JScrollPanel後面

這裏是ScrollPanel是如何創建的:

imagePane.setBackground(new java.awt.Color(153, 153, 153)); 
imagePane.setBorder(null); 
jSplitPane2.setRightComponent(imagePane); 

這裏是ScrollPanel

Canvas canvas = new Canvas(); 
canvas.setVisible(true); 
canvas.setImage(file); 
imagePane.setLayout(new GridBagLayout()); 
canvas.setSizeFromLoaded(); 
imagePane.add(canvas); 
imagePane.repaint(); 

Canvas類並沒有對小組的放置任何東西在我的面板的位置,它所做的只是構建和修改它。我在那裏有一個JPanel,它工作,但一旦我用JScrollPanel將它切換出來,它就開始放置它後面的畫布。

+1

_Here是如何創建ScrollPanel_:'jSplitPane2.setRightComponent(imagePane);'??? splitPane或scrollPane?爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org) –

+0

'imagePane = ScrollPane' ::'jSplitPane2 = SplitPane' ::'canvas = Panel' –

回答

0

的問題上,我想出瞭解決這個問題是使用這個:
imagePane.getViewport().add(canvas);

取而代之的是:
imagePane.add(canvas);

1

確保所有正在使用的輕質成分(的JPanel,JScrollPane的,等等)。我意識到你命名了你自己的JPanel Canvas的子類,但是你的代碼和描述有點混亂,因爲Canvas和ScrollPane是AWT類。

在你的意見中你說imagePane是一個ScrollPane(我假設你的意思是JScrollPane)。如果情況如此,那麼imagePane.setLayout不合適,應該刪除。你的代碼應該是以下幾點:

Canvas canvas = new Canvas(); 
canvas.setImage(someImageFile); 
canvas.setSizeFromLoaded(); 

JScrollPane imagePane new JScrollPane(canvas); 
imagePane.setBackground(new java.awt.Color(153, 153, 153)); 
imagePane.setBorder(null); 

jSplitPane2.setRightComponent(imagePane); 

,將工作提供setSetFromLoaded()能夠設置基於圖像的大小的畫布PREFERREDSIZE。如果尚未準備好計算它的大小,因爲圖像尚未加載(請記住,這通常發生在另一個線程上),那麼您可能需要將計算移入validate(),並在稍後進行。例如,爲什麼重寫doLayout(),您可以在組件重新驗證()時計算出您的首選大小。您還應該考慮繼承JComponent而不是JPanel,因爲您不需要添加任何子項。 JComponent同樣適用於JPanel。