В actionPerformed repaint не работает с новой темой

После того, как я нажимаю кнопку, actionPerformed называется. Начало нового Thread как это:

public void actionPerformed(ActionEvent evt) {
    try {
        Runnable r = new Runnable() {
            public void run() {
                try {
                    mylabel.setText("new text");
                    mylabel.revalidate();
                    mylabel.repaint();
                } catch (Exception x) {
                    x.printStackTrace();
                }
            }
        };

        Thread thread = new Thread(r);
        thread.start();
        MyFunction();

    // ...

После этого на myLabel строка, new text, не появляется, только после actionPerformed запустить.

1 ответ

Решение

Вы должны запустить код, связанный с GUI, в Thread Dispatch Thread (EDT). Не создавайте другую тему.

public void actionPerformed(ActionEvent evt) {
    try {
        SwingUtilities.invokeLater(
            new Runnable() {
                ...

Если actionPerformed это обратный вызов слушателя, он уже работает на EDT. Создать другойRunnable если обратный вызов занимает много времени, или он "замедлит" графический интерфейс.

Если MyFunction() Метод не связан с перерисовкой графического интерфейса или чем-то подобным, запускайте его в другом потоке, особенно если он требует значительных ресурсов.

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