イベントドリブンは、「ユーザが何かをしたときにプログラムが動く」というようなプログラムのことを言います。逆に言えば、「ユーザが何もしなければプログラムは何もしない」とも言えます。
ただ、このままでは、カウントダウンやアニメーションの実現は不可能ということになってしまいます。カウントダウンやアニメーションは、マルチスレッドによって実現します。
スレッドを利用したプログラムを挙げます。
ソースコードは以下の通り。
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行目において、ウインドウが表示されるタイミングで、新しいスレッドを作成しています。