Java 将JScrollPane滚动到底部
我需要将JScrollPane滚动到底部。JScrollPane包含一个JPanel,其中包含许多JLabel 要滚动到顶部,我只需执行以下操作:Java 将JScrollPane滚动到底部,java,swing,Java,Swing,我需要将JScrollPane滚动到底部。JScrollPane包含一个JPanel,其中包含许多JLabel 要滚动到顶部,我只需执行以下操作: scrollPane.getViewport().setViewPosition(new Point(0,0)); 但是我怎样才能精确地滚动到最底部呢?(太远而且会抖动)而不是我通常使用的setViewPosition(),如中所述。对于所需的矩形,可以使用适当标签的getBounds()结果 附录:@Matt在另一篇文章中指出,“如果在将文本输出
scrollPane.getViewport().setViewPosition(new Point(0,0));
但是我怎样才能精确地滚动到最底部呢?(太远而且会抖动)而不是我通常使用的
setViewPosition()
,如中所述。对于所需的矩形
,可以使用适当标签的getBounds()
结果
附录:@Matt在另一篇文章中指出,“如果在将文本输出到滚动窗格中的文本区域后使用以下代码,它将自动聚焦到文本区域的底部。”
在<代码> jTrrabts>代码>的具体情况下,还考虑使用<代码> DefaultCaret < /C> > >代码> AlWavsUpUpUT/<代码>,
< P> >经过多次尝试使用ScRuleStudiVistIle()方法查找一个以外的答案,我成功了。我发现,如果在将文本输出到滚动窗格中的文本区域后使用以下代码,它将自动聚焦到文本区域的底部textArea.setCaretPosition(textArea.getDocument().getLength());
所以,至少对我来说,我的打印方法是这样的
public void printMessage(String message)
{
textArea.append(message + endL);
textArea.setCaretPosition(textArea.getDocument().getLength());
}
如果您查看JTextArea文档 public void select(int selectionStart, int selectionEnd) 在指定的开始和结束位置之间选择文本。 此方法设置选定文本的开始和结束位置,强制执行开始位置必须大于或等于零的限制。结束位置必须大于或等于开始位置,并且小于或等于文本组件文本的长度 如果调用方提供的值不一致或超出范围,则该方法将无声地强制执行这些约束,且不会失败。具体而言,如果起始位置或结束位置大于文本长度,则会将其重置为等于文本长度。如果开始位置小于零,则重置为零;如果结束位置小于开始位置,则重置为开始位置。 因此,简单的解决方案是jTextArea.select(Integer.MAX_值,0);让Java来解决这个问题 我改编了这部电影。此版本在完成向下滚动后使滚动条保持工作状态
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()));
我试过几种方法。有些人使用
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();
}
JScrollBar=jsp.getVerticalScrollBar();
int x=bar.getValue();
对于(int i=100;i我想为这个问题贡献我的发现,因为我今天需要一个答案,这里没有一个解决方案对我有效,但我最终找到了一个。我有一个JList对象包装在一个JScrollPane中,我想在所有元素添加到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()));
}
我尝试了这里列出的所有解决方案,但似乎都没有任何效果。我在实验中发现了这一个,它工作得非常完美。我想我会把它留在这里,以防它可能会帮助其他人
ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );
只需将值设置为:vertical.getMaximum()-1
所有答案对我都不起作用。出于某种原因,我的JScrollPane
没有滚动到最底部,即使我重新验证了所有内容
这就是我的工作原理:
SwingUtilities.invokeLater(() -> {
JScrollBar bar = scroll.getVerticalScrollBar();
bar.setValue(bar.getMaximum());
});
我假设y位置将是文档大小-视图端口大小。在特定的情况下,<代码> JTrabtStudio,也考虑<代码> Debug TrpTy*StUpDeDeCalp()。
,插图。我发现这个答案特别有用,因为在我的例子中,我使用的自定义子类继承自JTextPane,我已经在使用自己的自定义打印例程,所以只需将那行代码添加到方法定义的末尾就非常方便了!@Jeff:Matt随后的回答建议使用setUpdatePolicy()
,也是由camickrI编写的,它恰好在上次添加的面板上方滚动。也就是说,在我的聊天界面中,您总是隐藏最后一条消息。请注意,您必须调用validate()
在将滚动条设置为其最大值之前,使用滚动条对组件进行操作。这是为了确保如果您从组件中添加/删除了元素,则获得最新的最大值。在Pastebin上的SSCE版本:@tom_mai78101,如果您从组件中添加/删除了元素,则您应该e revalidate()(用于Swing),not validate()(与AWT一起使用)。@camickr From,Swing和AWT的validation()之间似乎没有区别
methods.+1尽管它的分数为零,但这比camickr的答案更适合我。后一种解决方案不会在我将字符串插入文本窗格后立即完全滚动到底部。此解决方案总是滚动到底部。此解决方案的一个问题是它不再允许您向上滚动。您需要创建自定义AdjustmentListener以允许“e.getAdjustable.setValue(…)'在允许用户向上滚动时关闭。我的解决方案是在动态添加内容时设置布尔标志,并在滚动前检查该标志,然后始终将其设置为false。这样用户滚动将永远不会受到影响。修复了@jk的问题…尝试if(e.getAdjustable().getmax()!=prevMax){/*设置值*/}
那些有jk问题的人,检查下面的@Matthias Braun解决方案。它工作得很好。可以在常规JPanel上使用类似的方法,如setViewPosition()
(或您使用的其他方法)吗?还是只能在JScrollPane上移动窗格的内部?我找到了ans
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()));
}
ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );
SwingUtilities.invokeLater(() -> {
JScrollBar bar = scroll.getVerticalScrollBar();
bar.setValue(bar.getMaximum());
});