Swingのプログラムを書くとき、下のように書いても動くのであまり気にしていなかったのだが…
public class Main { public static void main(String[] args) { JFrame frame = new JFrame("This is Swing lesson."); frame.setBounds(100, 100, 400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
本来はGUIの生成はSwingのイベントディスパッチスレッド上で行わなければいけない決まりがある。
そのためには、初期化処理をRunnableの中に書き、SwingUtilities.invokeLater()に渡す必要がある。
そうすることによって初期化処理はSwingのイベントディスパッチスレッド上で実行されるようになる。
これを踏まえると、以下のように書くのが正しい初期化処理の書き方となるようだ。
public class Main { /** * @param args */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame("This is Swing lesson."); frame.setBounds(100, 100, 400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } }
最初の例のように書いても普通に動いてしまうのがややこしいところである。。。