学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その49 JTimer, JProgressBarを利用したプログラム

<<前  [TOP]  次>>


Swingには指定された時間ごとにアクションイベントを発行するタイマー(JTimer)が用意されています。
このタイマーは1つ以上のアクションイベントリスナーを関連づけることが出来ます。
タイマーはjavax.swing.Timerを用います。

java.lang.Object
    +--java.swing.Timer



javax.swing.Timerはイベントの発行を通知するActionListenerを関連づけて、一定時間ごとにactionPerformed()メソッドを呼び出します。
Timerの第一引数は呼び出す時間をミリ秒で指定します。
第2引数は呼び出すときに関連づけるActionListenerです。

import java.awt.event.*;
import javax.swing.*;

public class TimerTest implements ActionListener {
    :
    //1000ミリ秒(1秒)間隔でactionPerformed()を呼び出す
    Timer timer = new Timer(1000, this);
    timer.start();
        :
    /** タイマーから指定時間ごとに呼び出される*/
    public void actionPerformed(ActionEvent evt) {
        :



タイマーを生成した後に実行するには、start()メソッドを使用します。
また、停止するときにはstop()メソッドを使用します。
この他に、この後説明する「初期遅延」を使用して再起動するrestart()メソッドもあります。


タイマーは最初に起動する時間(初期遅延時間)を設定できます。
初期遅延時間にはタイマーを起動させる前に、setInitialDelay()メソッドでミリ秒を指定します。


また、通常タイマーは指定時間ごとに連続してアクションイベントを発行しますが、1度だけの発行でよい場合はsetRepeats()メソッドをfalseにします。
timerはTimerで生成されたインスタンスとします。

timer.setInitialDelay(5000);    //初期遅延時間を5秒とする
timer.setRepeats(false);    //イベント発行は1度だけ



1つのタイマーで2つ以上のイベントを発行することも出来ます。
具体的には、ActionListenerを実装したクラスを用意して、他のイベント登録と同様にaddActionListener()メソッドを利用します。

public class TimerTest implements ActionListener {
    :
     Timer timer = new Timer(1000, this);
    timer.addActionListener(new TimerTest2());
        :
     /**タイマーから指定時間ごとに呼び出される*/
    public void actionPerformed(ActionEvent evt ) {
        :
     }
 }

class TimerTest2 implements ActionListener {

    /**タイマーから指定時間ごとに呼び出される(2)*/
    public void actionPerformed(ActionEvent evt) {
        :
     }
}



以下のサンプルプログラムを作成してみましょう。


SwingTimerTest.java 直

/** Timer のテスト */

import java.awt.event.*;
import javax.swing.*;

public class SwingTimerTest implements ActionListener {

	private Timer timer;
	private JLabel label;
	private int sec = 1;	//時間追加用

	/** コンストラクタ */
	public SwingTimerTest() {

		//1000ミリ秒(1秒)間隔でactionPerformed()を呼び出す
		timer = new Timer(1000, this);
		label = new JLabel("0 second " );
	}

	/** タイマーから指定時間後とに呼び出される */
	public void actionPerformed(ActionEvent evt) {
		label.setText(sec + " seconds");	//ラベルに表示
		
		if(sec >= 10) {
			timer.stop();		//10秒になったら
		}
		else {
			sec++;
		}
	}

	/** main() */
	public static void main(String[] args) {

		SwingTimerTest sample = new SwingTimerTest();
		JFrame frame = new JFrame("TimerTest");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(sample.label, "Center");
		frame.pack();
		frame.setVisible(true);
		sample.timer.start();	// タイマースタート
	}
}



サンプルプログラムを実行してみましょう。
タイマーが表示されます。








完了までに時間のかかるような作業には、進捗バーを表示するとユーザーの不安を和らげることが出来ます。
Swingの進捗バーはjavax.swing.JProgressBarで生成します。
進捗バーは最小値と最大値を設定した後、現在値を指定すると値に沿った視覚効果を表示します。
また、最小値と最大値を表示して、そのスライダーから値を設定するものとしては、javax.swing.JSliderがあります。

java.lang.Object
    +--java.awt.Component
        +--java.awt.Container
            +--javax.swing.JComponent
                +--javax.swing.JProgressBar



進捗バーの生成方法も複数ありますが、一般的なのは「最小値」と「最大値」を指定する方法でしょう。
生成後の値の指定にはsetValue()メソッドを使用します。
値が設定されることで、値に対する適当な割合で視覚的に進捗状況が表現されます。

//最小値0、最大値100で進捗バーを生成
JProgressBar bar = new JProgressBar(0, 100);
bar.setValue(50);    //進捗バーの値を50とする



進捗状況を文字列でも表示するにはsetStringPainted()の引数をtrueとします。
こうすると「%」での表記も行われます。
また、「%」表記以外の文字列を表示したければ、setString()の引数で文字列を指定します。
barはJProgressBarで生成されたインスタンスとします。

//下のコメントを解除すると「%」の替わりに「読み込み中」と表示
//bar.setString("読み込み中");
bar.setStringPainted(true);    //進捗情報表示中「%」表示も行われます。



進捗バーの最小値あるいは最大値を変更する場合は、setMinimum(int)/setMaximum(int)メソッドを使用します。
barはJProgressBarで生成されたインスタンスとします。

bar.setMinimum(0);    //進捗バーの最小値を0に設定
bar.setMaximum(10);    //進捗バーの最大値を10に設定



以下のサンプルプログラムを作成してみましょう。


SwingJProgressBarTest.java 直

/** JProgressBarのテスト*/

import java.awt.event.*;
import javax.swing.*;

public class SwingJProgressBarTest implements ActionListener {

	private JProgressBar bar;
	private Timer timer;
        private JLabel label;
        private int sec = 1;    //時間追加用

	/** コンストラクタ */
	public SwingJProgressBarTest() {

		//最小値0、最大値10で生成
		bar = new JProgressBar(0, 10);
		bar.setValue(0);	//現在値を設定
		bar.setStringPainted(true);	//「% 」表示を使う

		//1000ミリ秒(1秒)間隔でactionPerformed()を呼び出す
                timer = new Timer(1000, this);
                label = new JLabel("0 second " );
        }

	/** タイマーから指定時間後とに呼び出される */
        public void actionPerformed(ActionEvent evt) {

                label.setText(sec + " seconds");        //ラベルに表示
		bar.setValue(sec);	//進捗バーに値を設定

                if(sec >= 10) {
                        timer.stop();           //10秒になったら
                }
                else {
                        sec++;
                }
        }

	/** main() */
        public static void main(String[] args) {

                SwingJProgressBarTest sample = new SwingJProgressBarTest();

                JFrame frame = new JFrame("JProgressBarTest");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(sample.label, "Center");
		frame.getContentPane().add(sample.bar, "South");
                frame.pack();
                frame.setVisible(true);

                sample.timer.start();   // タイマースタート
        }
}



サンプルプログラムを実行してみましょう。
タイマーと進捗バーが表示されます。








以下のサンプルプログラムを作成してみましょう。


SwingMyTimer.java 直

/** 時間を設定できるタイマーの作成 */

import java.awt.event.*;
import javax.swing.*;

public class SwingMyTimer implements ActionListener {

        private JProgressBar bar;
        private Timer timer;
        private JLabel label;
        private int sec = 1;    //時間追加用
	private int maxSec = 10;
	private JTextField secText;
	private JButton startB, stopB;
	private JPanel panel;

	/** コンストラクタ */
	public SwingMyTimer() {

		// maxSecをStringに変換した値を基にテキストフィールドを生成
		secText = new JTextField(Integer.toString(maxSec));

		//ボタンの生成
		startB = new JButton("Start");
		stopB = new JButton("Stop");

		//上記コンポーネントをパネルに配置
		panel = new JPanel();
		panel.add(secText);
		panel.add(startB);
		panel.add(stopB);

		//最小値0、最大値10で生成
                bar = new JProgressBar(0, 10);
                bar.setValue(0);        //現在値を設定
                bar.setStringPainted(true);     //「% 」表示を使う

                //1000ミリ秒(1秒)間隔でactionPerformed()を呼び出す
                timer = new Timer(1000, this);
                label = new JLabel("0 second " );

		// ボタンのイベント通知を登録
		startB.addActionListener(this);
		stopB.addActionListener(this);
	}

	/** タイマーからか、ボタンが押された時に呼び出される */
	public void actionPerformed(ActionEvent evt) {

		String command = evt.getActionCommand();

		try {

			// Startボタンが押されたら初期化してタイマースタート
			if (command.equals("Start")) {
				// テキストフィールドの内容をint へ変換
				maxSec = Integer.parseInt(secText.getText());
				bar.setMaximum(maxSec);	//進歩バーの最大値を再設定
				bar.setValue(0);	//進捗バーの現在値を設定

				sec = 1;	//時間表示用変数を再設定
				timer.start();	//タイマースタート
			}
			else if(command.equals("Stop")) {	//タイマーストップ
				timer.stop();	
			}
		}
		catch (NullPointerException e) {	//タイマーのアクションコマンドはnull

			label.setText(sec + " seconds");        //ラベルに表示
	                bar.setValue(sec);      //進捗バーに値を設定

        	        if(sec >= maxSec) {
                	        timer.stop();           //maxSecになったらタイマーストップ
                	}
            		else {
                       		 sec++;
			}
	        }
	}
	
        /** main() */
        public static void main(String[] args) {

                SwingMyTimer sample = new SwingMyTimer();

                JFrame frame = new JFrame("MyTimer");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(sample.panel, "North");	//パネルを配置
                frame.getContentPane().add(sample.label, "Center");
                frame.getContentPane().add(sample.bar, "South");
                frame.pack();
                frame.setVisible(true);

        }
}



サンプルプログラムを実行してみましょう。
秒数を入力できるタイマーです。
ストップボタンで停止も出来ます。








<<前  [TOP]  次>>