2010-04-26 86 views
9

我有一個JScrollpane,其內部有JPanel(面板包含一些JLabel s)。JScrollpane需要縮小寬度

我想要調整滾動窗格的大小,以實際更改其大小(可能低於內部組件的首選大小),而不僅僅是視口的大小。

當用戶縮小滾動窗格太小時,目標是讓內部面板優雅地消失(在我的miglayout中使用特定的縮小優先級等)。

+0

的問題是相當不清楚我,但你也許可以監控JScrollPane的大小的變化,當它變得比一些下界(隱藏順利反應)。 – 2010-04-28 11:44:10

+0

看起來,當JViewport的大小發生變化時,做一些愚蠢的重新佈局是唯一的辦法。 (爲了澄清,我基本上在一個滾動窗口的視口內有一個表格,我希望滾動窗格能夠確定表格的哪些行顯示,但我不希望它影響到顯示的列,我想要做什麼是爲不同的列指定一個收縮優先級,以便縮小文本框的水平尺寸將開始截斷特定的列。) – Mike 2010-04-28 22:41:04

回答

14

可能最好的方法是讓包含的組件始終與視口的寬度相同。要做到這一點,第一個包含的組件(即JViewPort的子節點,傳入JScrollPane構造函數或設置爲viewportView)需要實現javax.swing.Scrollable。關鍵方法是getScrollableTracksViewportWidth,應返回true

這裏有一個快速和骯髒的滾動的JPanel:

public class ScrollablePanel extends JPanel implements Scrollable { 
    public Dimension getPreferredScrollableViewportSize() { 
     return getPreferredSize(); 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return ((orientation == SwingConstants.VERTICAL) ? visibleRect.height : visibleRect.width) - 10; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return true; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 
} 
+0

真棒,謝謝!我不知道Scrollable界面。 – Mike 2010-05-11 22:23:15

+0

還有一件事。我只有這個解決方案使用'BorderLayout'。對於非常廣泛的視圖,默認的'FlowLayout'不能正常工作。 – 2012-11-13 23:03:55

+0

請勿使用流佈局。它只適用於演示和按鈕欄。現在有方法可以跟蹤流佈局的寬度。 – shemnon 2012-11-16 17:35:29