【问题标题】:JScrollpane needs to shrink its widthJScrollpane 需要缩小它的宽度
【发布时间】:2011-02-12 13:30:05
【问题描述】:

我有一个JScrollpane,里面有一个JPanel(面板包含一些JLabels)。

我想调整滚动窗格的大小以实际更改其大小(可能低于内部组件的首选大小),而不仅仅是视口的大小。

目标是当用户将滚动窗格缩小得太小时,内部面板会优雅地消失(在我的 miglayout 中使用特定的缩小优先级等)。

【问题讨论】:

  • 这个问题对我来说很不清楚,但是您也许可以监视 JScrollPane 的大小变化,并在它低于某个界限时做出反应(平滑隐藏)。
  • JViewport 的大小发生变化时,做一些愚蠢的重新布局似乎是唯一的方法。 (澄清一下,我基本上在滚动窗格的视口中有一个表格。我希望滚动窗格确定显示表格的哪些行,但我不希望它影响显示的列。我想要做的是为不同的列分配缩小优先级,以便缩小文本框的水平大小将开始截断特定列。)

标签: java swing jscrollpane miglayout


【解决方案1】:

可能最好的方法是让包含的组件始终与视口的宽度相同。为此,第一个包含的组件(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;
    }
}

【讨论】:

  • 太棒了,谢谢!我不知道 Scrollable 界面。
  • 还有一件事。我只使用BorderLayout 得到了这个解决方案。默认FlowLayout 不适用于非常宽的视图。
  • 不要使用流式布局。它仅适用于演示和按钮栏。现在有一种方法可以跟踪流布局的宽度。
猜你喜欢
  • 2021-07-10
  • 2019-11-07
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2017-02-28
  • 1970-01-01
相关资源
最近更新 更多