JTextArea не отображается четко в течение некоторого периода времени при нажатии на JButton во время выполнения - PullRequest
0 голосов
/ 10 апреля 2019

JTextArea не отображается четко для определенного периода.

Я создал JFrame, внутри которого добавлен JButton, при нажатии на JButton JFrame будет развернут и отобразит JTextArea и добавит 2 строкитекста с интервалом в 2 секунды.Проблема заключается в том, что при нажатии на JButton, JFrame раскрывается, но JTextArea не отображается четко (JTextArea отображается черным цветом), как показано ниже:

enter image description here

через 2 секунды он будет отображаться с 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должен отображаться как пустой, тогда пользователь должен иметь возможность просматривать 2 строки, введенные одна за другой.

Кто-нибудь может помочь в этом?

1 Ответ

3 голосов
/ 10 апреля 2019

через 2 секунды будет отображаться с двумя строками текста

Не использовать Thread.sleep (...).Это предотвращает перекрашивание фрейма.

Вместо этого вам нужно либо:

  1. переместить код в ActionListener в отдельный поток.Это можно сделать с помощью Swing Worker, как показано в учебном пособии по Swing o Concurrency, ссылка на которую приведена выше.
  2. Используйте таймер Swing для планирования обновлений текстовой области.Для этого подхода вы можете добавить текст в ArrayList.Затем вы запускаете таймер.Когда таймер срабатывает, вы удаляете текст в месте 0 и отображаете его в текстовой области.Когда ArrayList пуст, вы останавливаете таймер.Это позволит вам легко отображать несколько строк текста в текстовой области.
...