在运行时单击 JButton 时,JTextArea 在一段时间内没有清晰显示

JTextArea is not clearly displaying for some period of time while clicking on JButton at runtime

JTextArea 在特定时间段显示不清晰。

我创建了一个JFrame,在里面添加了一个JButton,当点击JButton时,JFrame会被展开,它会显示一个JTextArea,它会添加2行文本,间隔为2秒。问题是点击 JButton 时,JFrame 立即展开,但 JTextArea 显示不清晰(JTextArea 显示为黑色),如下所示:

2 秒后显示 2 行文本,如下所示:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class ExpandJFrame {
    public static JFrame frame;
    public static JButton btn;
    public static JTextArea textArea;

    public static void main(String[] args) {
        frame = new JFrame("JFrame Expand");
        frame.setSize(400, 200);

        btn = new JButton("Expand");
        btn.setBounds(10, 10, 80, 25);

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    frame.setSize(400, 400);
                    textArea = new JTextArea();
                    textArea.setBounds(5, 210, 370, 150);
                    textArea.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
                    frame.add(textArea);
                    Thread.sleep(1000);
                    textArea.append("FirstLine\n");
                    Thread.sleep(1000);
                    textArea.append("SecondLine\n");
                } catch (Exception e) {

                }
            }
        });
        frame.add(btn);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

预期场景:当点击 JButton 时,一次 JTextArea 应该清楚地显示为空,然后用户应该能够逐行查看输入的 2 行。

有人可以帮忙吗?

after 2 seconds it will be displayed with 2 lines of text

不要使用 Thread.sleep(...)。这可以防止框架重新绘制自身。

相反,您需要:

  1. 将 ActionListener 中的代码移至单独的线程。这可以通过使用 Swing Worker 来完成,如上面链接的 Swing 教程 o Concurrency 中所示。
  2. 使用 Swing 计时器安排文本区域的更新。对于这种方法,您可以将文本添加到 ArrayList。然后你启动定时器。当计时器触发时,您删除位置 0 处的文本并将其显示在文本区域中。当 ArrayList 为空时,您停止计时器。这将使您可以轻松地在文本区域中显示多行文本。