↓↓クリックして頂けると励みになります。
【49 | JComboBox】 << 【ホーム】 >> 【51 | ファイルからの読み込み・書き込み】
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) { : } }
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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(); // タイマースタート } }
作成したプログラムを実行して動作を確認します。
10秒のタイマーが表示されます。
~/Desktop/Programming/JP $ javac SwingTimerTest.java ~/Desktop/Programming/JP $ java SwingTimerTest
完了までに時間のかかるような作業には進捗バーを表示するとユーザーの不安を和らげることが出来ます。
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に設定
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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(); // タイマースタート } }
作成したプログラムを実行して動作を確認します。
タイマーと進捗バーが表示されます。
~/Desktop/Programming/JP $ javac SwingJProgressBarTest.java ~/Desktop/Programming/JP $ java SwingJProgressBarTest
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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); } }
作成したプログラムを実行して動作を確認します。
秒数を入力できるタイマーです。
ストップボタンで停止も出来ます。
~/Desktop/Programming/JP $ javac SwingMyTimer.java ~/Desktop/Programming/JP $ java SwingMyTimer
【49 | JComboBox】 << 【ホーム】 >> 【51 | ファイルからの読み込み・書き込み】
↓↓クリックして頂けると励みになります。