JTextArea не отображается четко в течение некоторого периода времени при нажатии на JButton во время выполнения

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

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

JTextArea не отображается четко в течение некоторого периода времени при нажатии на JButton во время выполнения

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

JTextArea не отображается четко в течение некоторого периода времени при нажатии на JButton во время выполнения

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 введенные строки одну за другой.

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

Прочтите docs.oracle.com/javase/tutorial/uiswing/параллелизм

SirFartALot 10.04.2019 13:42

Уже пробовал использовать SwingUtilities.invokeLater, но возникла та же проблема.

AbiSaran 10.04.2019 13:56

Возможно, это поможет: stackoverflow.com/questions/55593572/…

SirFartALot 10.04.2019 16:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме