Java Swing - JScrollPane 使视口宽度适合 JScrollPane 宽度

Java Swing - JScrollPane fit Viewport width to JScrollPane width

我一直在尝试缩小 JScrollPane 的内容宽度,例如。我已将 HorizontalScrollBarPolicy 设置为 NEVER,但这最终导致没有 ScrollBar 出现并且内容不再显示。

我希望它看起来像这样:

这是我的 MCVE:

final JPanel panel = new JPanel( new MigLayout( new LC().flowX().gridGapX( "20" ).fill() ) );

panel.add( new JXTitledSeparator( "Test" ), new CC().growX().spanX().wrap() );
panel.add( new JLabel( "Shrink me please!" ), new CC().minWidth( "1" ) );
panel.add( new JLabel( "Never shall anyone ever be able to shrink me." ), new CC().growX() );

final JScrollPane scrollPane = new JScrollPane( panel );
scrollPane.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );

final JFrame frame = new JFrame( "Test" );
frame.getContentPane().add( scrollPane );
frame.setVisible( true );
frame.pack();

遗憾的是,我不知道如何做到这一点,JScrollPaneJViewport 没有提供任何可能有用的方法,JScrollPane 本身也没有。

此外,我已经尝试使用 BoxLayoutFlowLayout 而不是 MigLayout 来实现相同的目的,以验证 MigLayout 不是问题。

尝试设置收缩标签的最大宽度。
你不需要滚动条?
if need to use scrollbar as needed from scroll pane constants

final JFrame frame = new JFrame( "Test" );
frame.setLayout(new BorderLayout());
frame.add( scrollPane , BorderLayout.CENTER);
frame.pack();
frame.setVisible( true );

使用了边框布局,并在可见之前移动了包。

您需要在面板上实现 Scrollable 接口。

您可能希望将 getScrollableTracksViewportWidth() 方法实现为 return true

这将强制面板的宽度与视口的宽度相匹配。然后面板上的每个组件将根据布局管理器的规则调整大小。

如果您不想自己实现 Scrollable 接口,那么您可以使用 Scrollable Panel,它提供了允许您控制可滚动属性的方法。