◆ Lego Mindstoms NXT - leJOS - (8) ボタン・リスナー
leJOS では、ボタンを押す、などのイベントを拾って、そのイベン
トに対する操作を実現する仕組みが用意されています。
たとえば、トライボットが動いているときに、エスケープ・ボタン
を押したらトライボットが止まるようにしてみましょう。
トライボットは、500 ミリ秒ずつ前進と後退を繰り返します。前進、
後退の間に 500 ミリ秒間のの停止があります。
■ リスナーを使わない実装
いままでの知識だけで実装してみます。
これだと、後退して、500ミリ秒間停止しているときでないと、プ
ログラムは停止しません。すなわち、好きなときにプログラムを停
止することができないのです。
□ while (!Button.ESCAPE.isPressed()) { // (1)
エスケープ・ボタンが押されていない間繰り返します。
■ リスナーを使った実装
それでは、エスケープ・ボタンを押したことを検知して、そのとき
の動作をするリスナークラスを使って、先ほどのプログラムを作り
直します。
なお、リスナークラスは、パッケージ l に入れることにします。
□ Button.ESCAPE.addButtonListener(new EscapeListener()); // (1)
エスケープ・ボタンにリスナーを登録します。登録するには、ボタ
ンのオブジェクトの addButtonListener メソッドを使います。
□ addButtonListener メソッド
---
void addButtonListener(ButtonListener aListener)
ボタンイベントのリスナーオブジェクトを追加します。
---
□ while (true) { // (2)
今度は無限ループにしておきます。
□ リスナーのソースです。
□ public class EscapeListener implements ButtonListener { // (1)
エスケープ・ボタンが押されたことを処理するリスナー・クラスは、
ButtonListener インタフェースを実装します。
□ ButtonListener インタフェースのメソッド
---
void buttonPressed(Button b)
void buttonReleased(Button b)
---
□ public void buttonPressed(Button button) { // (2)
ボタンが押されたときの処理を実装します。今回は、プログラムを
終了するようにします。
□ public void buttonReleased(Button button) { // (3)
ボタンから離れたときの処理を実装します。今回は、プログラムを
終了するようにします。
■ 内部クラスを使った実装
この程度の実装のリスナーなら、わざわざ別クラスにすることもな
いでしょう。
static な内部クラスを使って実装します。
□ static class EscapeListener implements ButtonListener { // (1)
内部クラスを使い、EscapeListener クラスを実装します。
以上
leJOS では、ボタンを押す、などのイベントを拾って、そのイベン
トに対する操作を実現する仕組みが用意されています。
たとえば、トライボットが動いているときに、エスケープ・ボタン
を押したらトライボットが止まるようにしてみましょう。
トライボットは、500 ミリ秒ずつ前進と後退を繰り返します。前進、
後退の間に 500 ミリ秒間のの停止があります。
■ リスナーを使わない実装
いままでの知識だけで実装してみます。
これだと、後退して、500ミリ秒間停止しているときでないと、プ
ログラムは停止しません。すなわち、好きなときにプログラムを停
止することができないのです。
------------------------------------------------------ import lejos.nxt.Button; import tb.Trybot; import u.NxtUtil; /** * 「トライボット」使用 * エスケープボタンを押すと止まる。 * (ただし、後退直後に押さないと止まらない) * @author maruno * @version 1.0, 2008-06-26 * @since 1.0 */ public class ButtonListener01 { public static void main(String[] args) { // トライボットオブジェクトの生成 Trybot trybot = new Trybot("trybot"); while (!Button.ESCAPE.isPressed()) { // (1) trybot.forward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); trybot.backward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); } } } ------------------------------------------------------
□ while (!Button.ESCAPE.isPressed()) { // (1)
エスケープ・ボタンが押されていない間繰り返します。
■ リスナーを使った実装
それでは、エスケープ・ボタンを押したことを検知して、そのとき
の動作をするリスナークラスを使って、先ほどのプログラムを作り
直します。
なお、リスナークラスは、パッケージ l に入れることにします。
------------------------------------------------------ import l.EscapeListener; import lejos.nxt.Button; import tb.Trybot; import u.NxtUtil; /** * 「トライボット」使用 * エスケープボタンを押すと止まる。 * @author maruno * @version 1.0, 2008-06-26 * @since 1.0 */ public class ButtonListener02 { public static void main(String[] args) { Button.ESCAPE.addButtonListener(new EscapeListener()); // (1) // トライボットオブジェクトの生成 Trybot trybot = new Trybot("trybot"); while (true) { // (2) trybot.forward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); trybot.backward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); } } } ------------------------------------------------------
□ Button.ESCAPE.addButtonListener(new EscapeListener()); // (1)
エスケープ・ボタンにリスナーを登録します。登録するには、ボタ
ンのオブジェクトの addButtonListener メソッドを使います。
□ addButtonListener メソッド
---
void addButtonListener(ButtonListener aListener)
ボタンイベントのリスナーオブジェクトを追加します。
---
□ while (true) { // (2)
今度は無限ループにしておきます。
□ リスナーのソースです。
------------------------------------------------------ package l; import lejos.nxt.Button; import lejos.nxt.ButtonListener; /** * エスケープ・ボタンを押下したときに動作するリスナー * * @author marunomaruno * @version 1.0, 2008/06/29 * @since 1.0 */ public class EscapeListener implements ButtonListener { // (1) /* * (非 Javadoc) * * @see lejos.nxt.ButtonListener#buttonPressed(lejos.nxt.Button) */ public void buttonPressed(Button button) { // (2) System.exit(0); } /* * (非 Javadoc) * * @see lejos.nxt.ButtonListener#buttonReleased(lejos.nxt.Button) */ public void buttonReleased(Button button) { // (3) System.exit(0); } } ------------------------------------------------------
□ public class EscapeListener implements ButtonListener { // (1)
エスケープ・ボタンが押されたことを処理するリスナー・クラスは、
ButtonListener インタフェースを実装します。
□ ButtonListener インタフェースのメソッド
---
void buttonPressed(Button b)
void buttonReleased(Button b)
---
□ public void buttonPressed(Button button) { // (2)
ボタンが押されたときの処理を実装します。今回は、プログラムを
終了するようにします。
□ public void buttonReleased(Button button) { // (3)
ボタンから離れたときの処理を実装します。今回は、プログラムを
終了するようにします。
■ 内部クラスを使った実装
この程度の実装のリスナーなら、わざわざ別クラスにすることもな
いでしょう。
static な内部クラスを使って実装します。
------------------------------------------------------ import lejos.nxt.Button; import lejos.nxt.ButtonListener; import tb.Trybot; import u.NxtUtil; /** * 「トライボット」使用 * エスケープボタンを押すと止まる。 * @author maruno * @version 1.0, 2008-06-26 * @since 1.0 */ public class ButtonListener03 { public static void main(String[] args) { Button.ESCAPE.addButtonListener(new EscapeListener()); // トライボットオブジェクトの生成 Trybot trybot = new Trybot("trybot"); while (true) { trybot.forward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); trybot.backward(); NxtUtil.pause(500); trybot.stop(); NxtUtil.pause(500); } } /** * ボタンを押下したときに動作するリスナー * @author marunomaruno * @version 1.0, 2008/06/29 * @since 1.0 */ static class EscapeListener implements ButtonListener { // (1) /* (非 Javadoc) * @see lejos.nxt.ButtonListener#buttonPressed(lejos.nxt.Button) */ public void buttonPressed(Button button) { System.exit(0); } /* (非 Javadoc) * @see lejos.nxt.ButtonListener#buttonReleased(lejos.nxt.Button) */ public void buttonReleased(Button button) { System.exit(0); } } } ------------------------------------------------------
□ static class EscapeListener implements ButtonListener { // (1)
内部クラスを使い、EscapeListener クラスを実装します。
以上