
这是一个简单的解决方案:
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
编辑:我认为这可能无法解决您的问题。尽管它有很多样板,但这是一个更好的解决方案:
private class ButtonContainerHost extends JPanel implements Scrollable { private static final long serialVersionUID = 1L; private final JPanel buttonContainer; public ButtonContainerHost(JPanel buttonContainer) { super(new BorderLayout()); this.buttonContainer = buttonContainer; add(buttonContainer); } @Override public Dimension getPreferredScrollableViewportSize() { Dimension preferredSize = buttonContainer.getPreferredSize(); if (getParent() instanceof JViewport) { preferredSize.width += ((JScrollPane) getParent().getParent()).getVerticalScrollBar() .getPreferredSize().width; } return preferredSize; } @Override public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return orientation == SwingConstants.HORIZonTAL ? Math.max(visibleRect.width * 9 / 10, 1) : Math.max(visibleRect.height * 9 / 10, 1); } @Override public boolean getScrollableTracksViewportHeight() { if (getParent() instanceof JViewport) { JViewport viewport = (JViewport) getParent(); return getPreferredSize().height < viewport.getHeight(); } return false; } @Override public boolean getScrollableTracksViewportWidth() { return true; } @Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return orientation == SwingConstants.HORIZonTAL ? Math.max(visibleRect.width / 10, 1) : Math.max(visibleRect.height / 10, 1); }}它实现了Scrollable以完全控制滚动,在跟踪视口高度方面做了花哨的技巧,以确保在空间可用时按钮可以扩展,并始终将垂直滚动条的宽度增加到首选宽度。当垂直滚动条可见时,它可能会扩展,但无论如何看起来还是很糟糕的。像这样使用它:
scrollPane = new JScrollPane(new ButtonContainerHost(buttonContainer));
在我看来,由于javax.swing.ScrollPaneLayout中可能存在错误,因此需要此解决方法:
if (canScroll && (viewSize.height > extentSize.height)) { prefWidth += vsb.getPreferredSize().width;}在这里,extentSize设置为视口的首选大小,而viewSize设置为viewport.getViewSize()。这似乎不正确,因为AFAIK视口内的视图大小应始终等于首选大小。在我看来,视图大小应该与视口的实际大小进行比较,而不是其首选大小。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)