イベントドリブンとスレッド

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


イベントドリブンとスレッド

イベントドリブンは、「ユーザが何かをしたときにプログラムが動く」というようなプログラムのことを言います。逆に言えば、「ユーザが何もしなければプログラムは何もしない」とも言えます。

ただ、このままでは、カウントダウンやアニメーションの実現は不可能ということになってしまいます。カウントダウンやアニメーションは、マルチスレッドによって実現します。

スレッドを利用する

スレッドを利用したプログラムを挙げます。

ソースコードは以下の通り。

S301/MyJFrame.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 * JFrameを継承したクラスです。
 */
public class MyJFrame extends JFrame implements ActionListener, Runnable {
	/**
	 * デフォルトのシリアルバージョン ID(warning回避)。
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * ボタン1。
	 */
	private JButton jButton1 = new JButton("朝");
	/**
	 * ボタン2。
	 */
	private JButton jButton2 = new JButton("夜");
	/**
	 * ラベル1。
	 */
	private JLabel jLabel1 = new JLabel("メッセージ欄");
	/**
	 * ラベル2。
	 */
	private JLabel jLabel2 = new JLabel();
	/**
	 * スレッド。
	 */
	private Thread thread;
	
	/**
	 * コンストラクタ。
	 */
	public MyJFrame() {
		// レイアウトを設定する
		this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
		
		// フレームにボタンとラベルを登録する
		this.getContentPane().add(this.jButton1);
		this.getContentPane().add(this.jButton2);
		this.getContentPane().add(this.jLabel1);
		this.getContentPane().add(this.jLabel2);
		
		// リスナを設定する
		this.jButton1.addActionListener(this);
		this.jButton2.addActionListener(this);
	}
	
	@Override
	public void setVisible(boolean b) {
		if(b && this.thread == null) {
			// スレッドを作成し、実行する(新しいスレッドが生成される)
			this.thread = new Thread(this);
			this.thread.start();
		} else if(! b && this.thread != null) {
			// スレッドを停止するための準備をする
			this.thread = null;
		}
		super.setVisible(b);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object object = e.getSource();
		
		if(object == this.jButton1) {
			this.jLabel1.setText("おはようございます");
		} else if(object == this.jButton2) {
			this.jLabel1.setText("こんばんは");
		}
	}
	
	@Override
	public void run() {
		int count = 0;
		while(this.thread != null) {
			this.jLabel2.setText(count + "秒経過しました");
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				; // 何もしない
			}
			
			count ++;
		}
	}
}

S301/S301.java

import javax.swing.JFrame;

/**
 * スレッドを利用します。
 */
public class S301 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		JFrame jFrame = new MyJFrame();
		jFrame.setTitle("swing test");
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setSize(400, 300);
		
		// ウインドウを表示する(新しいスレッドが生成される)
		jFrame.setVisible(true);
	}
}

実行結果は以下の通り。

スレッドを利用する

何もしないでもラベルの文字列が更新されていくことが分かります。

MyJFrameクラスの 62行目において、ウインドウが表示されるタイミングで、新しいスレッドを作成しています。

最終更新: 2013/03/10 , 公開: 2013/03/09
▲top