SwingUtillitiesのinvokeLaterメソッド

年末です。

色々あって久しぶりに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

シアリス 販売

日複数回返信を服用しないでください。用量の間を通過する24時間を許可します。貴方の医師に連絡するか、勃起が痛い場合、または4時間以上続く救急医療の手当てを受けること。長時間勃起が(勃起)ペニスを損傷することがあります。- シアリス 販売