我需要将JScrollPane滚动到底部。 JScrollPane包含一个JPanel,它包含许多JLabel。
要滚动到顶部,我只是这样做:
scrollPane.getViewport().setViewPosition(new Point(0,0));
但如何精确滚动到最底部? (太远而且紧张不安)
答案 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
的特定情况下,还要考虑使用DefaultCaret
到ALWAYS_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对其进行排序!