使JScrollPane自动向下滚动

时间:2010-03-20 15:23:12

标签: java swing awt jscrollpane jtextarea

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

7 个答案:

答案 0 :(得分:37)

对于(我认为)更简单的答案,请查看:Text Area Scrolling

  

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

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

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

答案 1 :(得分:7)

我在这里找到答案: JScrollPane and JList auto scroll

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

答案 2 :(得分:6)

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

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

添加新数据后。

这会自动滚动到JScrollPane。

答案 3 :(得分:6)

这是解决方案。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我的解决方案Screen Shoot

Alternative SC Link(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);

    }

}

答案 6 :(得分:0)

被接受的解决方案很好,但是仅当文本区域是可编辑的,即没有jTextArea.setEditable(false)时才有效。 Krigath建议的解决方案较为笼统,但存在此处JScrollPane and JList auto scroll提出的问题。使用该问题的答案,您可以获得一般的解决方案,例如:

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

然后,仅当垂直滚动条展开时,才响应于附加的文本行向下滚动窗格。

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