Для приложений Swing есть причина, по которой мы используем EventQueue.invokeLater()
? Должен ли Thread.start()
работать одинаково?
Еще одно преимущество Thread.start заключается в том, что мы можем сказать, что поток прерывается, поскольку EventQueue.invokeLater
не предоставляет нам объект Thread
.
Вы должны использовать EventQueue.invokeLater для всех обновлений графического интерфейса, так как Swing в одностороннем порядке. См. Http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading
Вы можете запускать потоки для выполнения вычислений и т.д., Но должны обновлять GUI с помощью invokeLater.
Ваши два варианта запуска приложения Swing:
EventQueue.invokeLater()
а также
SwingUtilities.invokeLater()
Я предпочитаю использовать SwingUtilities. Оба они помещают runnable в поток Event Dispatch (EDT). Вам не нужна ручка для EDT.
Ваш код находится либо на EDT, либо другой вызов метода invokeLater() помещает runnable в EDT. Вы можете определить любое условие с помощью вызова метода SwingUtilities.isEventDispatchThread().
Метод Thread.start() предназначен для ваших собственных рабочих потоков. Или, если хотите, вы можете использовать класс javax.swing.SwingWorker для собственных потоков рабочих Swing.
Здесь шаблон, который я использую для запуска каждого приложения Swing, я пишу.
package com.ggl.game2048;
import javax.swing.SwingUtilities;
import com.ggl.game2048.model.Game2048Model;
import com.ggl.game2048.view.Game2048Frame;
public class Game2048 implements Runnable {
@Override
public void run() {
new Game2048Frame(new Game2048Model());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Game2048());
}
}
Короче и точно. Этот класс делает 3 вещи.
Вы можете увидеть остальную часть приложения Swing 2048 в моей статье Java.