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

时间:2019-04-10 11:40:07

标签: java swing jframe jtextarea

JTextArea在特定时期内显示不清晰。

我创建了一个JFrame,在其中添加了JButton,在单击JButton时,JFrame将被展开并显示JTextArea,并且将以2秒的间隔添加两行文本。问题是单击JButton时,取消扩展了JFrame,但是JTextArea不能清晰显示(JTextArea以黑色显示),如下所示:

enter image description here

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

enter image description here

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时,atonce JTextArea应该清楚地显示为空,然后用户应该能够查看输入的两行。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

  

2秒后将显示两行文字

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

相反,您需要:

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