将JScrollPane滚动到底部

我需要滚动一个JScrollPane到底部。 JScrollPane包含一个JPanel,它包含一些JLabel的。

滚动到顶部,我只是做:

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

但是我怎么滚动到底部? (太远了,它不安)

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

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

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

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

 public void printMessage(String message) { textArea.append(message + endL); textArea.setCaretPosition(textArea.getDocument().getLength()); } 
 scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { e.getAdjustable().setValue(e.getAdjustable().getMaximum()); } }); 

除了setViewPosition() ,我通常使用scrollRectToVisible()如何使用滚动窗格中所述 。 您可以使用适当标签的getBounds()的结果作为所需的Rectangle

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

JTextComponent的特定情况下,也可以考虑使用DefaultCaretsetUpdatePolicy()方法来ALWAYS_UPDATE ,如图所示。

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

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

 JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength())); 
 // 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); 

我已经尝试了几种方法。 有些使用bar.setValue(bar.getMaximum()) ,但是最大值始终为100,而bar的范围将远远大于100.有些使用textArea,但不适合在JScrollPane中只有一个JTable 。 而我关于一种方法,可能愚蠢但有效。

 JScrollBar bar=jsp.getVerticalScrollBar(); int x=bar.getValue(); for(int i=100;i<2000000000;i+=100) { bar.setValue(i); if(x==bar.getValue()) break; x=bar.getValue(); } 

如果你看看JTextArea文档

public void select(int selectionStart,int selectionEnd)

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

如果调用者提供的值不一致或超出范围,则该方法静静地强制执行这些约束,而不会失败。 具体来说,如果起始位置或结束位置大于文本的长度,则重置为等于文本长度。 如果起始位置小于零,则重置为零,如果结束位置小于起始位置,则重置为起始位置。

所以简单的解决scheme是jTextArea.select(Integer.MAX_VALUE,0); 让Java把它整理出来!