使JScrollPane自动向下滚动

我正在尝试使用JTextArea实现JScrollPane。 JTextArea被附加到,我希望JScrollPane在添加更多文本时继续向下滚动。 怎么能实现这一目标?

对于(我认为)一个更简单的答案签出: 文本区域滚动 。

在JDK5之前,您必须在每次追加后手动更改插入符号的位置。 您现在可以将此行为设置为默认值,如下所示:

JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 

这样做的好处是您不需要在代码中多次使用此代码段!

我在这里找到了答案: JScrollPane和JList自动滚动

 scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { e.getAdjustable().setValue(e.getAdjustable().getMaximum()); } }); 

如果您经常向其写入数据,您可以使用:

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

在您添加新数据之后。

这将自动滚动到JScorllPane。

这是解决方案。

 JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 

可以解决这个问题:您可以将该侦听器声明为类,然后在需要它的事件上实例化它。 之后,您可以在强制重新绘制屏幕后删除该类。 奇迹般有效。

我的解决方案 屏幕拍摄

替代SC链接 (PS:为SCREEN SHOOT编辑)

 import javax.swing.*; import javax.swing.text.DefaultCaret; public class NewClass { public static void main(String[] args) { JFrame win = new JFrame("test"); win.setSize(800, 500); win.setResizable(false); win.setLayout(null); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setLocationRelativeTo(null); JTextArea txtListNum = new JTextArea(); JScrollPane barList = new JScrollPane(txtListNum); DefaultCaret crList = (DefaultCaret) txtListNum.getCaret(); crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); barList.setLocation(10, 10); // Scrollbar Position barList.setSize(180, 450); // Scrollbar Dimession win.add(barList); // Scrolbar add to Frame win.setVisible(true); } } 

接受的解决方案效果很好,但只有在文本区域可编辑时,即没有jTextArea.setEditable(false) 。 Krigath建议的解决方案更为通用,但是存在问题,如JScrollPane和JList自动滚动 。 使用该问题的答案,您可以获得一般解决方案,例如:

  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(); }); 

然后,只有当垂直滚动条扩展时,才会向下滚动窗格,以响应附加的文本行。

我承认可以找到一个过滤事件而没有额外变量的方法,如果有人发布它,我将不胜感激。