私は、swing がスレッドセーフではないことを学びました。さらに深く掘り下げると、マルチスレッドに関連するさまざまな問題を防ぐために、swing コンポーネントへのすべての変更をイベント ディスパッチ スレッドで行う必要があることがわかりました。しかし、情報はそこで完全に止まっているように見えました。インターネット上でアクセス可能な場所ならどこでもこれを行う方法を説明する優れたチュートリアルはないようです。
他の問題に関連して投稿されたコードからの情報をまとめてパッチを当てると、プログラム内のすべてのスイング変更の周りに乱雑なコード ブロックを配置する必要があるように思われました (自分のコードのこの例のように):
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
setTitle("Frame title");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(800, 480);
setLocationRelativeTo(null);
setIconImage(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource("Frame icon.png")));
}
});
} catch (Exception e) {
e.printStackTrace();
}
基本、これでいいの?コード内の Swing コンポーネントを変更するたびに、そのコード (または invokeLater と同等のもの) を配置する必要がありますか?
また、Swing がこれを自動的に行わないのはなぜですか?