Java 使JScrollPane自动向下滚动
我正在尝试用JTextArea实现一个JScrollPane。JTextArea被追加到,我希望随着更多文本的添加,JScrollPane保持向下滚动。如何做到这一点?我在这里找到了答案: 对于(我认为是)一个更简单的答案,请查看: 在JDK5之前,您必须在每次追加后手动更改插入符号的位置。您现在可以将此行为作为默认设置,如下所示:Java 使JScrollPane自动向下滚动,java,swing,awt,jscrollpane,jtextarea,Java,Swing,Awt,Jscrollpane,Jtextarea,我正在尝试用JTextArea实现一个JScrollPane。JTextArea被追加到,我希望随着更多文本的添加,JScrollPane保持向下滚动。如何做到这一点?我在这里找到了答案: 对于(我认为是)一个更简单的答案,请查看: 在JDK5之前,您必须在每次追加后手动更改插入符号的位置。您现在可以将此行为作为默认设置,如下所示: JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textAr
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
这样做的好处是,您不需要在代码中多次使用此代码段
解决方法是可能的:您可以将该侦听器声明为类,然后在需要它的事件上实例化它。之后,您可以在强制重新绘制屏幕后删除该类。工作起来很有魅力。如果您不断向其写入数据,您可以使用:
textArea.setCaretPosition(textArea.getDocument().getLength());
在添加新数据之后
这将自动在JScorllPane中向下滚动。以下是解决方案
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
接受的解决方案效果良好,但仅当文本区域可编辑时,即不带
jTextArea.setEditable(false)
。所建议的解决方案更一般,但存在此处所问的问题。使用该问题的答案,您可以得到一般解决方案,例如:
JScrollPane scrollPane = new JScrollPane(jTextArea);
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
scrollPane.getVerticalScrollBar().addAdjustmentListener(
e -> {
if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
return;
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
});
只有当垂直滚动条根据附加的文本行展开时,窗格才会向下滚动。
我承认可以找到一种无需额外变量就可以过滤事件的方法,如果有人发布它,我将不胜感激。+1
setUpdatePolicy()
API解释了这么多。我已经相应地更新了我对所引用问题的回答。是的,API一直在变化,很难一直跟上变化。这很有帮助,但如果用户在最后一行结束后以外的任何地方单击,自动滚动就会停止。这是不直观的。如果正常的行为起作用就好了,只需滚动到底部,自动滚动就会被重新激活。@jcalfee314,请查看其他可能的解决方案。@jcalfee314为了解决这个问题,我添加了一个按钮,单击该按钮后,再次启用自动滚动。按钮的代码只需要以下内容:textArea.setCaretPosition(textArea.getDocument().getLength());您的“解决方案”实际上是链接到问题的问题:如果您手动尝试移动垂直滚动手柄,此代码将再次滚动到底部!虽然可能,但这并不是最好的解决方案,@camickr的答案是-)+1表示正确答案,尽管它与Rob的公认答案相同:-)
JScrollPane scrollPane = new JScrollPane(jTextArea);
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
scrollPane.getVerticalScrollBar().addAdjustmentListener(
e -> {
if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
return;
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
});