Java 文本区域缓慢自动向下滚动

Java 文本区域缓慢自动向下滚动,java,swing,Java,Swing,我需要在txt文件的文本区域显示一些文本。我把所有的行都读到一个arraylist中,然后把它们附加到文本区 现在我需要慢慢向下滚动,如果它显示在某个地方的显示器上,人们就可以以一定的速度阅读 我尝试过使用defaultcaret方法,我在所有其他问题中都找到了这个方法,但我无法让它起作用。我也尝试过使用滚动窗格,但没有成功 private void displayWords() { JTextArea textArea = new JTextArea(); textArea.

我需要在txt文件的文本区域显示一些文本。我把所有的行都读到一个arraylist中,然后把它们附加到文本区

现在我需要慢慢向下滚动,如果它显示在某个地方的显示器上,人们就可以以一定的速度阅读

我尝试过使用defaultcaret方法,我在所有其他问题中都找到了这个方法,但我无法让它起作用。我也尝试过使用滚动窗格,但没有成功

 private void displayWords() {
    JTextArea textArea = new JTextArea();
    textArea.setPreferredSize(this.getPreferredSize());
    textArea.setFont(font);
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    textArea.setAutoscrolls(true);
    DefaultCaret caret = (DefaultCaret) textArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    textArea.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
    for (String s : lines) {
        textArea.append(s + System.getProperty("line.separator"));
    }

    /*
    JScrollPane scrollpane = new JScrollPane(textare);
    scrollpane.setPreferredSize(this.getPreferredSize());
    scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    scrollpane.setAutoscrolls(true);
    scrollpane.setViewportView(textare);
    */

    add(textArea);
    repaint();
}

正如在注释部分中所写的那样,将JTExtArea放在JScrollPane中。启动计时器,并在每个actionPerformed()上通过垂直滚动条的setValue()向下滚动

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TAScroll {
    public static void main(String[] args) {
        JFrame f=new JFrame();
        JTextArea ta=new JTextArea();
        for (int i=0;i<50; i++) {
            ta.append(i+"\n");
        }
        final JScrollPane scroll=new JScrollPane(ta);
        f.add(scroll);

        Timer t=new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getValue()+10);
                if (scroll.getVerticalScrollBar().getValue()>=scroll.getVerticalScrollBar().getMaximum()) {
                    ((Timer)e.getSource()).stop();
                }
            }
        });

        t.start();

        f.setLocationRelativeTo(null);
        f.setSize(200,100);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}
import javax.swing.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共级塔斯克罗尔酒店{
公共静态void main(字符串[]args){
JFrame f=新的JFrame();
JTextArea ta=新的JTextArea();
对于(int i=0;i=scroll.getVerticalScrollBar().getMaximum()){
((计时器)e.getSource()).stop();
}
}
});
t、 start();
f、 setLocationRelativeTo(空);
f、 设置大小(200100);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
}

使用Swing
计时器
。为了更快地获得更好的帮助,发布一个(最小完整可验证示例)或(简短、自包含、正确的示例)。
JTextArea textArea=new JTextArea();textArea.setPreferredSize(this.getPreferredSize())最好是像
jtextareatextarea=newjtextarea(5,20);//建议一个尺寸
可能有点复杂,但你会明白——设置尺寸的原因是它是一个带有gridbaglayout的全屏面板。只是填一下而已。但我会尝试使用计时器设置插入符号您可以设置插入符号位置或设置视口可视区域,可能比更改滚动条值更可靠…只是说…您是正确的。这只是一个快速的解决方案。它实际上也没有停止计时器:)这个想法很好,我只是觉得
JScrollBar\setValue
不可靠;)