垂直JScrollPane切断了孩子的右侧

时间:2015-09-03 18:40:02

标签: java swing jscrollpane

首先,我们有JPanel。由于其环境和背景,其宽度可以变化。它以垂直顺序包含一些组件(例如,JLabels,为简单起见)。这些组件的某些内容宽度太大而无法显示:

Overflow with a JPanel

这很有效,直到我们有很多项目。因此,我们将面板放入JScrollPane并带有HORIZONTAL_SCROLLBAR_NEVER标记。这是我的预期结果:

Expected result with JScrollPane

但实际上还有其他事情发生了。不强制使用长文本的第二个标签的大小,并且面板在视口之外生长:

Actually happens

最简单的正确解决方案是什么?

评论

  • 实际上,对于各种各样的组件,这可能会更复杂,因此使用JList不是一个合适的解决方案。
  • 我使用默认设置的默认组件。我想找到一个显式设置最少的解决方案。

1 个答案:

答案 0 :(得分:5)

您需要为面板实施Scrollable界面,以强制面板的宽度适合滚动窗格的视口。

一种简单的方法是使用Scrollable Panel

例如,您可以使用:

ScrollablePanel panel = new ScrollablePanel(...);
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

编辑:

如果您自己实现Scrollable接口,最简单的实现可能是:

@Override
public Dimension getPreferredScrollableViewportSize()
{
    return getPreferredSize();
}

@Override
public int getScrollableUnitIncrement(Rectangle visible, int orientation, int direction)
{
    return 1;
}

@Override
public int getScrollableBlockIncrement(Rectangle visible, int orientation, int direction)
{
    return 20;
}

@Override
public boolean getScrollableTracksViewportWidth()
{
    return true;
}

@Override
public boolean getScrollableTracksViewportHeight()
{
    return false;
}