将JScrollPane滚动到底部

时间:2011-02-28 21:27:01

标签: java swing

我需要将JScrollPane滚动到底部。 JScrollPane包含一个JPanel,它包含许多JLabel。

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

scrollPane.getViewport().setViewPosition(new Point(0,0));

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

11 个答案:

答案 0 :(得分:102)

JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );

答案 1 :(得分:35)

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

textArea.setCaretPosition(textArea.getDocument().getLength());

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

public void printMessage(String message)
{
    textArea.append(message + endL);
    textArea.setCaretPosition(textArea.getDocument().getLength());
}

答案 2 :(得分:24)

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
    public void adjustmentValueChanged(AdjustmentEvent e) {  
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
    }
});

答案 3 :(得分:16)

而不是setViewPosition(),我通常使用scrollRectToVisible()中描述的How to Use Scroll Panes。您可以使用相应标签getBounds()的结果来显示所需的Rectangle

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

JTextComponent的特定情况下,还要考虑使用DefaultCaretALWAYS_UPDATE的{​​{3}}方法,例如setUpdatePolicy()

答案 4 :(得分:11)

我改编了code of 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);
}

答案 5 :(得分:1)

如果您的JScrollPane只包含JTextArea,那么:

JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength()));

答案 6 :(得分:1)

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

这对我有用:

SwingUtilities.invokeLater(() -> {
        JScrollBar bar = scroll.getVerticalScrollBar();
        bar.setValue(bar.getMaximum());
});

答案 7 :(得分:0)

// Scroll to bottom of a JScrollPane containing a list of Strings.

JScrollPane      scrollPane;
DefaultListModel listModel;
JList            list;

listModel = new DefaultListModel();

list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1); // -1 = display max items in space available

scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(200, 50));

// Append text entries onto the text scroll pane.
listModel.addElement("text entry one");
listModel.addElement("text entry two");
listModel.addElement("text entry three");
listModel.addElement("text entry four");

// Get the index of the last entry appended onto the list, then
// select it, and scroll to ensure it is visible in the vewiport.
int lastNdx = listModel.getSize() - 1;
list.setSelectedIndex(lastNdx);
list.ensureIndexIsVisible(lastNdx);

JPanel panel = new JPanel();
panel.add(scrollPane);

答案 8 :(得分:0)

我想把我的发现贡献给这个问题,因为我今天需要一个答案,这里没有一个解决方案适合我,但我终于找到了一个。我有一个包含在JScrollPane中的JList对象,我希望在将所有元素添加到DefaultListModel之后滚动到最后一个项目。它基本上是这样的:

JList list = new JList();
DefaultListModel listModel = new DefaultListModel();
JScrollPane listScroller = new JScrollPane(list);

public void populateList()
{
     //populate the JList with desired items...
     list.ensureIndexIsVisible(listModel.indexOf(listModel.lastElement()));
}

我尝试了这里列出的所有解决方案但似乎没有任何效果。我在试验时找到了这个,它完美无缺。以为我可以把它留在这里,以防有人帮助别人。

答案 9 :(得分:0)

ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );

只需将值设置为:vertical.getMaximum() - 1

答案 10 :(得分:-2)

如果查看JTextArea文档

public void select(int selectionStart,                    int selectionEnd)

选择指定的开始和结束位置之间的文本。 此方法设置所选文本的开始和结束位置,强制执行起始位置必须大于或等于零的限制。结束位置必须大于或等于起始位置,并且小于或等于文本组件文本的长度。

如果调用者提供的值不一致或超出范围,则该方法会以静默方式强制执行这些约束,并且不会出现故障。具体来说,如果开始位置或结束位置大于文本的长度,则将其重置为等于文本长度。如果起始位置小于零,则将其重置为零,如果结束位置小于起始位置,则将其重置为起始位置。

所以简单的解决方案是jTextArea.select(Integer.MAX_VALUE,0);让Java对其进行排序!