将JScrollPane滚动到底部

Mat*_*att 44 java swing

我需要将JScrollPane滚动到底部.JScrollPane包含一个JPanel,其中包含许多JLabel.

要滚动到顶部,我只是这样做:

scrollPane.getViewport().setViewPosition(new Point(0,0));
Run Code Online (Sandbox Code Playgroud)

但是如何精确滚动到最底部?(太远而且紧张不安)

cam*_*ckr 105

JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在将滚动条设置为其最大值之前,必须使用滚动条调用组件上的"validate()".这是为了确保您在组件中添加/删除元素时获得最新的最新值.垃圾箱上的SSCCE版本:http://pastebin.com/v1xi35ZK (7认同)
  • 我碰巧使它滚动到最后添加的面板上方。也就是说,在我的聊天UI中,您总是隐藏了最后一条消息。 (2认同)

小智 36

在使用scrollRectToVisible()方法尝试查找除了一个以外的答案的几个小时后,我成功了.我发现如果在将文本输出到滚动窗格中的文本区域后使用以下代码,它将自动聚焦在文本区域的底部.

textArea.setCaretPosition(textArea.getDocument().getLength());
Run Code Online (Sandbox Code Playgroud)

所以,至少对我来说,我的打印方法看起来像这样

public void printMessage(String message)
{
    textArea.append(message + endL);
    textArea.setCaretPosition(textArea.getDocument().getLength());
}
Run Code Online (Sandbox Code Playgroud)


小智 24

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
    public void adjustmentValueChanged(AdjustmentEvent e) {  
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案的一个问题是它不再允许您向上滚动.您需要创建一个自定义AdjustmentListener,允许在允许用户向上滚动时关闭'e.getAdjustable.setValue(...)'. (7认同)
  • +1即使得分为零,这对我来说比camickr的回答更好.在将insertString插入文本窗格后,后一种解决方案不会始终完全滚动到底部.此解决方案始终滚动到最底部. (4认同)
  • 那些拥有 jk 的人。问题,请查看下面的@Matthias Braun 解决方案。它完美地工作。 (2认同)

tra*_*god 16

而不是setViewPosition(),我通常使用scrollRectToVisible(),如何使用滚动窗格中描述.你可以使用适当的标签的结果getBounds()为所需Rectangle.

附录:@Matt在另一个答案中注意到,"如果在将文本输出到滚动窗格中的文本区域后使用以下代码,它将自动聚焦在文本区域的底部."

在一个特定情况下JTextComponent,还考虑使用setUpdatePolicy()的方法DefaultCaretALWAYS_UPDATE,示出在这里.


Mat*_*aun 11

我改编了Peter Saitz代码.滚动条完成向下滚动后,此版本将保持滚动条的工作状态.

private void scrollToBottom(JScrollPane scrollPane) {
    JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
    AdjustmentListener downScroller = new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            Adjustable adjustable = e.getAdjustable();
            adjustable.setValue(adjustable.getMaximum());
            verticalBar.removeAdjustmentListener(this);
        }
    };
    verticalBar.addAdjustmentListener(downScroller);
}
Run Code Online (Sandbox Code Playgroud)

  • 当我动态添加内容时,除了这个之外没有其他解决方案适合我。谢啦。 (2认同)

Dav*_*hin 9

没有一个答案对我有用。出于某种原因JScrollPane,即使我重新验证了所有内容,我也没有滚动到最底部。

这对我有用:

SwingUtilities.invokeLater(() -> {
        JScrollBar bar = scroll.getVerticalScrollBar();
        bar.setValue(bar.getMaximum());
});
Run Code Online (Sandbox Code Playgroud)