垂直 JScrollPane 切断其 children 的右侧
Vertical JScrollPane cuts off its children's right side
首先,我们有一个JPanel
。它的宽度可以根据其环境和背景而变化。它包含一些垂直顺序的组件(例如 JLabels
,为简单起见)。此组件的某些内容宽度太大而无法显示:
在我们有很多项目之前,这非常有效。因此,我们将面板放入带有 HORIZONTAL_SCROLLBAR_NEVER
标志的 JScrollPane
中。这是我的预期结果:
但实际上发生了其他事情。没有强制第二个带有长文本的标签的大小,并且面板超出了视口:
最简单的正确解法是什么?
评论
- 实际上,对于各种各样的组件,这可能会更复杂,因此使用
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;
}
首先,我们有一个JPanel
。它的宽度可以根据其环境和背景而变化。它包含一些垂直顺序的组件(例如 JLabels
,为简单起见)。此组件的某些内容宽度太大而无法显示:
在我们有很多项目之前,这非常有效。因此,我们将面板放入带有 HORIZONTAL_SCROLLBAR_NEVER
标志的 JScrollPane
中。这是我的预期结果:
但实际上发生了其他事情。没有强制第二个带有长文本的标签的大小,并且面板超出了视口:
最简单的正确解法是什么?
评论
- 实际上,对于各种各样的组件,这可能会更复杂,因此使用
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;
}