将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
的特定情况下,也可以考虑使用DefaultCaret
的setUpdatePolicy()
方法来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把它整理出来!