トップページ > dsPIC入門 > Javaでハイパーターミナル(8)
今回はキーボードからの入力によるイベント処理を実装します。 Enterキーを押したときに関数を呼び出して処理を行えるようにします。 この処理の記述方法は、あらかじめクラスとしてキーボードが押されたときの処理を用意しておきます。 そしてアプリケーション側でキー入力を受け付けるように宣言す これ、マイコンの割り込み処理の記述によく似ていると思います。 Javaでは“割り込み”とは呼ばずに“イベント”と呼ぶそうですですが…。
Javaにはキーボードの入力から関数を呼ぶ方法がいくつかあります。ここでは、汎用的で簡単に実装できる (…と個人的に思っている)KeyAdapterクラスを継承する方法で実装します。 また、ボタンのアクションイベントの時と同様に、イベント処理の中でテキストボックスへ文字を表示するテスト を行うので、MainFrameクラスの内部クラスとして宣言することにします。
//****************************************************************************************
//キー入力のイベント処理を内部クラスとして実装
class KeyInput extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
//ENTERキーならば、テキストエリアに表示。
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
tx.append("Enterキーが押されました。\n");
}
}
}
…という関数(ではなくメソッドか)がキーボードが押されたときに毎回呼ばれます。 今回はEnterキーにだけ反応させたいので、KeyCodeというやつを読み取ってEnterキーならば処理を行う… という感じで組みます。
“e”というのは、KeyEventクラスのオブジェクトで、keyPressed()メソッドの引数となっています。 別に名前は“e”ではなくても良いのですが、今回は深く考えずにeとしました。 この引数にはキーボードからの入力イベントの詳細情報が含まれています。 KeyEventクラス内のgetKeyCode()というメソッドを呼ぶと、その時に押されていたキーの「キー・コード」 というやつを返してくれます。KeyCodeの便利なところは、文字以外の方向キーやEnterキー、ファンクションキー などであっても検出することができる点です。EnterキーのKeyCodeは“KeyEvent.VK_ENTER”です。
前にテキストエリアのところで作ったテキストエリアに対して、文字を書きます。 このメソッドはボタンとアクションクラスのところで一度使ったことがありました。 txというのは今作っているアプリケーションのテキストエリアの名前でした。append()メソッドを呼んで、 テキストエリアに文字列を追加します。今回のKeyInputクラスをMainFrameクラスの内部クラスとして 定義しているので、普通にtx.…と書けばアクセスすることができます。
上でキーボードが押されたときの処理をする部分は完成しました。次に、これがキーボードが押されたときに 呼ばれるように「キー・リスナー」というのに登録する作業が必要です。
//KeyInputクラスをKeyListenerに登録する。 tx.addKeyListener(new KeyInput());
“addKeyListener() ”というメソッドを呼ぶだけです。引数にはイベント処理の内容を記述したクラス (KeyAdapterクラス等を継承しているクラス)を入れます。今回は引数のカッコのなかで“new KeyInput()”として いきなりクラスをコンストラクトしてしまっています。1行だけで何をやっているのか分かるので、 この書き方がよく用いられるようです…。
今回は、テキストエリア内にカーソルがあって、そこでEnterキーを押した時にさっき定義したkeyPressed()メソッドが 呼ばれることを想定しています。よって、addKeyListener()メソッドはテキストエリアに対して呼んでいます。
ファイル名は“serial_canvas4.java”です。
//******************************************************************************
//Javaでハイパーターミナル(4) キー入力イベントを実装
//******************************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import gnu.io.*;
import java.io.*;
//******************************************************************************
//メインクラス。メイン関数内では、ただMainFrameを作成するだけです。
public class serial_canvas4
{
//=============================================================================
//メイン関数
public static void main(String args[])
{
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
}
}
//******************************************************************************
//実際のコンポーネントとかは、このクラスで管理します。JFrameを継承・・・
class MainFrame extends JFrame
{
//=============================================================================
//クラスのフィールド
JTextArea tx;
//=============================================================================
//コンストラクタ
MainFrame()
{
//============================================================================
//JFrameクラスのコンストラクタを呼びます
super("serial_canvas4");
//============================================================================
//コンテント・ペインを作成。コンテント・ペインはJPanel型です。
JPanel cp = new JPanel();
cp.setLayout(null);
add(cp);
//============================================================================
//テキストエリアおよびスクロールペインを作成。
tx = new JTextArea();
tx.setLineWrap(true);
JScrollPane sp = new JScrollPane(tx);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sp.setBounds(50,50,400,300);
cp.add(sp);
Font font = new Font("SansSerif",Font.PLAIN,16);
tx.setFont(font);
//============================================================================
//COMポート選択のためのコンボボックスを追加
JComboBox com_combo = new JComboBox();
com_combo.addItem("COM1");
com_combo.addItem("COM2");
com_combo.addItem("COM3");
com_combo.addItem("COM4");
com_combo.addItem("COM5");
com_combo.addItem("COM6");
com_combo.addItem("COM7");
com_combo.addItem("COM8");
com_combo.setBounds(120,20,80,20);
cp.add(com_combo);
com_combo.setSelectedItem("COM5");
JLabel com_label = new JLabel("COMポート :");
com_label.setBounds(50,20,100,20);
cp.add(com_label);
//============================================================================
//通信速度(ボー・レート)選択のためのコンボボックスを追加
JComboBox baud_combo = new JComboBox();
baud_combo.addItem("4800");
baud_combo.addItem("9600");
baud_combo.addItem("19200");
baud_combo.addItem("38400");
baud_combo.addItem("57600");
baud_combo.addItem("115200");
baud_combo.addItem("230400");
baud_combo.setBounds(350,20,80,20);
cp.add(baud_combo);
baud_combo.setSelectedItem("115200");
JLabel baud_label = new JLabel("ボー・レート :");
baud_label.setBounds(250,20,100,20);
cp.add(baud_label);
//============================================================================
//ボタンを追加
JButton bt1 = new JButton(new open_action());
bt1.setBounds(50,400,150,40);
cp.add(bt1);
JButton bt2 = new JButton(new close_action());
bt2.setBounds(300,400,150,40);
cp.add(bt2);
//----------------------------------------------------------------------------
//ここからが追加部分です。
//KeyInputクラスをKeyListenerに登録する。
tx.addKeyListener(new KeyInput());
}
//*****************************************************************************
//内部クラスとしてアクションクラスを定義(bt1用です)
class open_action extends AbstractAction
{
//============================================================================
//コンストラクタ
open_action()
{
putValue(Action.NAME,"接続");
}
//============================================================================
//ボタンがおされた際の処理
public void actionPerformed(ActionEvent bt1_act)
{
tx.append("接続しました。\n");
}
}
//*****************************************************************************
//内部クラスとしてアクションクラスを定義(bt2用です)
class close_action extends AbstractAction
{
//============================================================================
//コンストラクタ
close_action()
{
putValue(Action.NAME,"切断");
}
//============================================================================
//ボタンがおされた際の処理
public void actionPerformed(ActionEvent bt1_act)
{
tx.append("切断しました。\n");
}
}
//*****************************************************************************
//キー入力のイベント処理を内部クラスとして実装
class KeyInput extends KeyAdapter
{
//============================================================================
//何かキーボードが押されたときに呼ばれるメソッド。
public void keyPressed(KeyEvent e)
{
//ENTERキーならば、テキストエリアに表示。
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
tx.append("Enterキーが押されました。");
}
}
}
}