Java 垂直JScrollPane切断了孩子们的右侧

Java 垂直JScrollPane切断了孩子们的右侧,java,swing,jscrollpane,Java,Swing,Jscrollpane,首先,我们有一个JPanel。它的宽度可以因环境和上下文而变化。它包含一些组件,例如jlabel,以简化垂直顺序。某些组件的内容宽度太大,无法显示: 在我们有很多物品之前,这是非常有效的。因此,我们将面板放入带有水平滚动条标志的JScrollPane中。这是我的预期结果: 但实际上发生了一些其他的事情。长文本的第二个标签的大小不会被强制,并且面板会从视口中伸出: 最简单的正确解决方案是什么 评论 实际上,对于各种各样的组件,这可能更复杂,因此使用JList不是一个合适的解决方案。 我使用带有默认

首先,我们有一个JPanel。它的宽度可以因环境和上下文而变化。它包含一些组件,例如jlabel,以简化垂直顺序。某些组件的内容宽度太大,无法显示:

在我们有很多物品之前,这是非常有效的。因此,我们将面板放入带有水平滚动条标志的JScrollPane中。这是我的预期结果:

但实际上发生了一些其他的事情。长文本的第二个标签的大小不会被强制,并且面板会从视口中伸出:

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

评论 实际上,对于各种各样的组件,这可能更复杂,因此使用JList不是一个合适的解决方案。 我使用带有默认设置的默认组件。我想找到一个解决方案,用最少的显式设置。 您需要为面板实现可滚动界面,以强制面板的宽度适合滚动窗格的视口

一个简单的方法是使用

例如,您可以使用:

ScrollablePanel panel = new ScrollablePanel(...);
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
编辑:

如果您自己实现可滚动界面,最简单的实现可能是:

@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;
}
您需要为面板实现可滚动界面,以强制面板的宽度适合滚动窗格的视口

一个简单的方法是使用

例如,您可以使用:

ScrollablePanel panel = new ScrollablePanel(...);
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
编辑:

如果您自己实现可滚动界面,最简单的实现可能是:

@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;
}

绝对正确。但我仍然希望可以用本机组件的功能来解决这个问题。@DávidHorváth这是本机组件的功能。可滚动界面的设计使组件可以与JScrollPane一起工作。一些组件,如JTable、JTextArea实现了可滚动的接口。JList也实现了它,但您已经声明它不是有效的解决方案。然而,JPanel没有实现它,这就是为什么您需要自己实现它。您不必使用建议的类。如果你想的话,你可以自己实现这5个可滚动的方法。可滚动的效果相对较好。但是长标签的行为有点奇怪:没有添加hellip,文本流入面板的填充区域并在右侧裁剪。即使使用方法的精确副本,也会发生这种情况。解决办法是什么?@DávidHorváth,发布你的文章,说明问题所在。图片不能帮助我们理解您使用的布局。即使有你的方法的精确副本,也会发生这种情况。-我没有测试这些方法。我使用ScrollablePanel,所以我不必一直重复代码。@camickr14哦,不!在我最近的评论中,我注意到一个类似的问题是如何发生的,希望能有一个快速的提示。放松点,我会接受你的回答。绝对正确。但我仍然希望可以用本机组件的功能来解决这个问题。@DávidHorváth这是本机组件的功能。可滚动界面的设计使组件可以与JScrollPane一起工作。一些组件,如JTable、JTextArea实现了可滚动的接口。JList也实现了它,但您已经声明它不是有效的解决方案。然而,JPanel没有实现它,这就是为什么您需要自己实现它。您不必使用建议的类。如果你想的话,你可以自己实现这5个可滚动的方法。可滚动的效果相对较好。但是长标签的行为有点奇怪:没有添加hellip,文本流入面板的填充区域并在右侧裁剪。即使使用方法的精确副本,也会发生这种情况。解决办法是什么?@DávidHorváth,发布你的文章,说明问题所在。图片不能帮助我们理解您使用的布局。即使有你的方法的精确副本,也会发生这种情况。-我没有测试这些方法。我使用ScrollablePanel,所以我不必一直重复代码。@camickr14哦,不!在我最近的评论中,我注意到一个类似的问题是如何发生的,希望能有一个快速的提示。放松点,我会接受你的回答。