年末です。 色々あって久しぶりにSwing周りを調べ直してみようと思いました。 久しぶりに見てみたら色々知らないことがあったのでメモしておきます。
SwingUtillities#invokeLater(Runnable)
通常、Swing はスレッドに対して安全ではありません。すべての Swing コンポーネントと関連クラスには、特に説明がないかぎり、イベントディスパッチスレッド上でアクセスしてください。
javax.swing (Java Platform SE 6) Swingに対する操作は全て特殊なスレッドの上で行われなければならないみたいです。詳しいことはよくわかりませんが、メインスレッドの上で実行するとよくないことがおこるのかもしれません。GUIアプリケーションでは通常ボタンを押したとき等のイベントの中でSwingコンポーネントにアクセスするので普通のイベント処理は問題ないのですが、アプリケーションを構築するときのJFrameをnewしてタイトルやらウィンドウサイズやらを設定する処理もメインスレッド上でやるのはよくないみたいです。
メインスレッドでアプリケーションを構築する書き方(よくない)
import javax.swing.JFrame;
/**
* JFrameのサンプルアプリケーション
*/
public class DeprecatedJFrameSample {
/**
* コンストラクタ。
*/
public DeprecatedJFrameSample() {
JFrame mainWindow = new JFrame("年越しはどん兵衛");
mainWindow.setSize(400, 300);
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.setVisible(true);
}
/**
* アプリケーションのエントリポイント。
*
* @param args 起動パラメータ文字列の配列
*/
public static void main(String[] args) {
new DeprecatedJFrameSample();
}
}
SwingUtillities#invokeLater メソッドを使ってアプリケーションの構築処理が別スレッドで実行されるようにします。 アプリケーションの初期化をなんとかスレッドで行う(よい)
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
* JFrameのサンプルアプリケーション
*/
public class JFrameSample {
/**
* コンストラクタ。
*/
public JFrameSample() {
JFrame mainWindow = new JFrame("年越しはどん兵衛");
mainWindow.setSize(400, 300);
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.setVisible(true);
}
/**
* アプリケーションのエントリポイント。
*
* @param args 起動パラメータ文字列の配列
*/
public static void main(String[] args) {
// アプリケーションの初期化をイベントディスパッチスレッドで実行する
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
new JFrameSample();
}
});
}
}
Trackback URL for this post:http://blog.smartnetwork.co.jp/staff/trackback/45
|
|||



シアリス 販売