Обработка потока рассылки событий - PullRequest
3 голосов
/ 30 марта 2010

У меня есть вопрос о «ветке рассылки событий». У меня есть основной класс, который также является JFrame. Он инициализирует остальные компоненты в коде, некоторые из них не включают Swing, а некоторые - нет. Достаточно ли просто инициализировать основной класс, используя EDT, как это? ...

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Main();
        }
    });
}

Таким образом, все будет работать в потоке диспетчера событий.

Ответы [ 4 ]

6 голосов
/ 31 марта 2010

Этого, как правило, достаточно, пока вы не начнете использовать фоновые потоки для расчетов, сбора данных и т. Д. Затем вы должны быть осторожны, чтобы убедиться, что вы находитесь на EDT, прежде чем изменять компонент свинга или его модель. *

Вы можете проверить, выполняете ли вы на EDT, с помощью:

    if (SwingUtilities.isEventDispatchThread()) {
        // Yes, manipulate swing components
    } else {
        // No, use invokeLater() to schedule work on the EDT
    }

Также см. Класс SwingWorker для получения подробной информации о том, как передать работу фоновому потоку и обработать результаты в EDT

.
2 голосов
/ 20 февраля 2013

Devon_C_Miller ответ правильный. Я просто хочу указать на ярлык для вызова потока отправки события.

Вот как я запускаю все свои приложения Swing.

import javax.swing.SwingUtilities;

import com.ggl.source.search.model.SourceSearchModel;
import com.ggl.source.search.view.SourceSearchFrame;

public class SourceSearch implements Runnable {

    @Override
    public void run() {
        new SourceSearchFrame(new SourceSearchModel());

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SourceSearch());
    }

}

Вы можете скопировать это в каждый проект Swing, просто изменив имена.

2 голосов
/ 31 марта 2010

Так работают все примеры из учебника Sun. Прочтите раздел из учебника по Swing по Concurrency для получения дополнительной информации о том, почему это сделано таким образом.

2 голосов
/ 31 марта 2010

Это путь. Единственное, с чем вам следует быть осторожным, это если прослушиватель, который вы регистрируете в компонентах Swing, будет порождать новый поток (часто для выполнения некоторых длительных вычислений). Такие новые потоки должны будут использовать invokeLater, если они должны выполнять операции с графическим интерфейсом.

...