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

java - 垂直JScrollPane切断了 child 的右侧-LMLPHP

在我们有很多项目之前,这非常有效。因此,我们将面板放入带有JScrollPane标志的HORIZONTAL_SCROLLBAR_NEVER中。这是我的预期结果:

java - 垂直JScrollPane切断了 child 的右侧-LMLPHP

但是实际上还有其他事情发生。带有长文本的第二个标签的大小不是强制性的,并且面板会超出视口:

java - 垂直JScrollPane切断了 child 的右侧-LMLPHP

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

注释


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

最佳答案

您需要为面板实现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;
}

09-11 17:58