2010-11-16 102 views
1

我只是無法得到這個權利。我有一個滑塊來增加我的JPanel的大小(用作畫布繪製)。每當JPanel收到事件時,我用setBounds()調整它的大小,我可以看到它調整大小爲秒,但下一個Paint或其他東西將它切換回由滑塊的首選大小屬性給出的原始大小。如何修改JScrollPane中的JPanel大小?

public class ShapesMainFrame extends JFrame { 
    private PaintCanvas paintCanvas; 
    public ShapesMainFrame() { 
     [...] 
     JScrollPane scrollPane = new JScrollPane(paintCanvas); 
     scrollPane.setPreferredSize(new Dimension(1,600)); 
     add(scrollPane, BorderLayout.CENTER); 
     pack(); 
    } 
} 

public class PaintCanvas extends JPanel { 
    [...] 
    public void setScale(int value) { 
     setSize(1000,1000); 
    } 
} 

因此,當我嘗試將JPanel的大小更改爲較大的值時,它應該調整大小,滾動條應該顯示正確嗎?那麼它保持在600px高,我怎麼設置在一開始。

+0

您可以發佈SSCCE? – javamonkey79 2010-11-17 01:37:22

回答

7

使用佈局管理器時,切勿使用setSize()或setBounds。它的「首選尺寸」非常重要。通常,組件的首選大小由佈局管理器自動確定。但是如果您在面板上進行自定義繪畫,則可能需要手動確定首選大小。

當面板的首選大小大於滾動窗格的大小時,將出現滾動條。重寫getPreferredSize()方法(首選解決方案)或使用自定義面板的setPreferredSize()方法。

+2

謝謝!我也試過setPreferredSize(),但它沒有工作,所以我試圖setSize。但覆蓋getPreferredSize()完美工作! :) – sekmet64 2010-11-17 06:28:28

3

所有您需要做的就是在更新JScollPane的大小後調用revalidate()內容。另外,在使用佈局管理器時使用setPreferredSize()。

public void setScale(int value) { 
    setPreferredSize(new Dimension(1000, 1000); 
    revalidate(); 
} 

這將強制JScrollPane更新它的滾動條。

此外,您可以撥打

paintCanvas.revalidate() 

如果你想從你的paintCanvas類以外的更新JScrollPane的