2010-04-26 80 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