出现滚动条时,包含JPanel的JScrollPane调整大小

出现滚动条时,包含JPanel的JScrollPane调整大小,第1张

出现滚动条时,包含JPanel的JScrollPane调整大小

这是一个简单的解决方案:

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视口内的视图大小应始终等于首选大小。在我看来,视图大小应该与视口的实际大小进行比较,而不是其首选大小。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5490692.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存