swing GUI(スレッドポリシー)

パッケージSwingの「Swing のスレッドポリシー」に書かれていること

アプリケーションやアプレットの構築時および表示時には、イベントディスパッチスレッドに制御を渡すように注意してください。制御を渡し、Swing の処理を開始するためには、invokeLater を使用することをお勧めします。

方法1

public class MyApp implements Runnable {
    public void run() {
        // Invoked on the event dispatching thread.
        // Construct and show GUI.
    }

    public static void main (String [] args) {
        SwingUtilities.invokeLater(new MyApp(args));
    }
}

方法2

public class MyApp {
    MyApp(String[] args) {
        // Invoked on the event dispatching thread.Do any initialization
        // here.
    }

    public void show() {
        // Show the UI.
    }

    public static void main(final String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MyApp(args).show();
            }
        });
    }
}

invokeLaterの説明では

 Runnable doHelloWorld = new Runnable() {
     public void run() {
         System.out.println("Hello World on " + Thread.currentThread());
     }
 };

 SwingUtilities.invokeLater(doHelloWorld);
 System.out.println("This might well be displayed before the other message.");
public static void main(final String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new MyApp(args).show();
         }
    });
}

isMiddleMouseButton(MouseEvent anEvent)
          マウスイベントが中央のマウスボタンを示す場合に true を返します。
isRightMouseButton(MouseEvent anEvent)
          マウスイベントが右マウスボタンを示す場合に true を返します。
isLeftMouseButton(MouseEvent anEvent)
          マウスイベントが左マウスボタンを示す場合に true を返します。

isEventDispatchThread()
          現在のスレッドが AWT イベントディスパッチスレッドの場合に true を返します。
java.awt.EventQueue.isDispatchThread()

long 	getId()
          このスレッドの識別子を返します。
String 	getName()
          このスレッドの名前を返します。

/**
 *  ボタンにイベント 
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class EventTest2 extends JFrame implements ActionListener {
	JLabel label;
	JLabel declabel;
	JButton button;
	int count = 0;
	int deccount = 100;
	/* コンストラクタ */
	public EventTest2(){
		System.out.println(Thread.currentThread().getName());
		setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
		label = new JLabel(count + " clicks", JLabel.CENTER); //ラベルを作る
		declabel = new JLabel(deccount + " remains", JLabel.CENTER); //ラベルを作る
		button = new JButton("Click Me!");         //ボタンを作る
		setLayout(new BorderLayout());     //レイアウトマネージャを指定
		add(declabel, BorderLayout.NORTH);
		add(label, BorderLayout.CENTER);   //ラベルを真ん中に
		add(button, BorderLayout.SOUTH);   //ボタンを下に配置
		setLocationByPlatform(true);       //ウインドウの位置を自動化
		pack();                  //ボタンに合わせてフレームの大きさを調節
		setVisible(true);                  //実際に表示する
		button.addActionListener(this);
		System.out.println(Thread.currentThread().getName());
	}
	/* イベントがあったらここに来る */
	public void actionPerformed(ActionEvent e) {
		//イベントがbuttonで起こっていたら…
		System.out.println(Thread.currentThread().getName());
		if (e.getSource() == button) {
			//countを増加
			count++;
			deccount--;
			//ラベルの文字を換える。
			label.setText(count + " clicks");
			declabel.setText(deccount + " remains");
		}
	}
	/********* main **********/
	public static void main(String[] args){
		/* フレームを作成(事実上のプログラム実行) */
		System.out.println(Thread.currentThread().getName());
		EventTest2 myframe = new EventTest2();
		System.out.println(Thread.currentThread().getName());
		EventTest2 myfram2 = new EventTest2();
	}
}










聖愛高等学校
http://www.seiai.ed.jp/
2012/9/28