【问题标题】:Textarea slowly autoscroll down文本区域慢慢自动向下滚动
【发布时间】:2015-04-24 11:47:19
【问题描述】:

我需要在 txt 文件中的文本区域显示一些文本。我已将所有行读入一个数组列表,并将它们附加到文本区域。

现在我需要慢慢向下滚动,如果它显示在某处的监视器上,人们将能够阅读。

我已经尝试使用在所有其他问题中找到的 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();
}

【问题讨论】:

  • 使用 Swing Timer。为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • JTextArea textArea = new JTextArea(); textArea.setPreferredSize(this.getPreferredSize()); 最好是JTextArea textArea = new JTextArea(5,20); // suggest a size
  • 可能有点复杂,但你会明白的 - for example
  • setSize 是因为它是一个带有网格布局的全屏面板。它只是为了填写。但是我尝试使用计时器来设置插入符号

标签: java swing


【解决方案1】:

正如注释部分中所写,将 JTExtArea 放在 JScrollPane 中。启动一个 Timer 并在每个 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);
    }
}

【讨论】:

  • 您可以设置插入符号位置或设置视口可视区域,可能比更改滚动条值更可靠...只是说...
  • 你说得对。这只是快速的解决方案。它实际上也不会停止计时器:)
  • 这个想法很好,我很好 JScrollBar#setValue 不可靠;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多