トップページ > dsPIC入門 > Javaでハイパーターミナル(10)
前回、最低限のポート・オープンやポート・クローズを行うクラスを作りました。ずっとGUIコンポーネントを
並べて作ってきた今回のアプリケーションでは、各コンポーネントはシリアル通信用のクラスからアクセスされます。
接続・切断のボタンが押された場合には単にポートのオープンやクローズのメソッドを呼び出すだけで済みます。
しかし、コンボボックスに関してはシリアル通信クラスのopen()メソッドが直接コンボボックスの値を
読む必要があったり、テキストエリアについていえば、テキストエリアに表示されている文字列を
送信メソッドの引数へ入れて送信動作を行う…という具合にアクセスが必要になってきます。
ここでは、シリアル通信のための各メソッドと頻繁にアクセスし合うテキストエリアやコンボボックスといった コンポーネントをフィールドとしてひっくるめた新しいシリアル通信用のクラスを作ります。 方法は簡単で、前回つくったシリアル通信クラスを継承して、さらにコンポーネントを追加するだけです。 わざわざこのようにコーディングするのは、汎用性を高めるためと、純粋にわかりやすいからです。 …といっても、単にオブジェクト指向と言ってしまえばそれまでですね。マイコンプログラムに慣れている と、このクラスとか継承とかが未だにしっくりこないのですが・・・。
クラスのフィールドは以下の通りとします。 これらは最初に作っていたMainFrameクラスの基本コンポーネントでした。 コンボボックスはポートを開く時に、その内容を読み取ります。 テキストエリアはシリアル通信の際にデータを入出力します。 …ということで、 シリアル通信クラスからのアクセスが行われるコンポーネントはこのクラスのフィールドとして 扱ってしまうことにします。
COMポート選択用のコンボボックス。このクラスのメソッドは、コンストラクタ、ポートを開くメソッド、ポートを閉じるメソッドの3つです。 クラスの大枠は以下の通りです。
class Serial_Class { //============================================================================= //クラスのフィールド JComboBox com_combo; JComboBox baud_combo; JTextArea tx; JScrollPane scrollPane; //============================================================================= //コンストラクタ Serial_Class() //============================================================================= //開くメソッド open() //============================================================================= //閉じるメソッド close() }
コンストラクタです。これは前までMainFrameクラスのコンストラクタの中で行っていた 各コンポーネントの初期化です。 テキストエリアとコンボボックスは今回からこのSerial_Classクラスのフィールドとなったので、 その初期化作業はここで行っておくことにします。特に新しいことはありません…。
//============================================================================= //コンストラクタ Serial_Class() { //テキストエリアを作成 tx = new JTextArea(); //スクロールペインを作成して、その上にテキストエリアを貼り付けておきます。 scrollPane = new JScrollPane(tx); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //COMポート用のコンボボックスを作成して、アイテムを入れておきます。 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.setSelectedItem("COM5"); //ボー・レート用のコンボボックスを作成して、アイテムを入れておきます。 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.setSelectedItem("115200"); }
ポートを開くメソッドです。フィールドであるコンボボックスの値を取得して、 スーパークラスであるSerial_BaseクラスのSerial_open()メソッドを呼びます。 Serial_open()メソッドは正常にポートが開けた場合はtrueを返してくれるので、 もし正常に開ければテキストボックスに「接続しました」と表示することにします。 新しく使うメソッドがあるので、そこだけ取り上げておきます。
Serial_BaseクラスのSerial_open()メソッドの1つめの引数はString型の COMポート名となります。COMポート名はcom_comboの名前で定義しているコンボボックスの 値ですから、“getSelectedItem()”メソッドでこれを取得します。取得したItemはオブジェクト型なので、 toString()メソッドで文字列に変換しておきます。
Serial_open()メソッドの2つめの引数はint型のボーレートでした。 ボーレートはbaud_comboの名前で定義しているコンボボックスの値となります。これも同様に “getSelectedItem()”メソッドで取得します。これをint型整数にするために、まず toString()メソッドで文字列にしてから、さらにラッパークラスのメソッド “Integer.parseInt()”を呼んでint型にします。これは、かなり回りくどい方法かと思うのですが、 1つくらいはこんな感じの力技的な処理を覚えておくといい…かもしれません(汗) パッと思いついて、個人的に気に入ってしまったのでこのまま使っています。
//============================================================================= //ポートオープンの関数 void open() { //正常にオープンできたかを調べるのに使うflagです。 boolean flag; //コンボボックスから、選択されているCOMポート名を取得します。文字列にしておきます。 String COM_Name = (com_combo.getSelectedItem()).toString(); //コンボボックスから、選択されているボー・レートを取得します。int型に直しておきます。 int Baud_Rate = Integer.parseInt((baud_combo.getSelectedItem()).toString()); //開く。 flag = Serial_open(COM_Name,Baud_Rate); //正常にオープンできたなら… if(flag) { tx.append("接続しました。\n\n"); } }
こちらは単にSerial_BaseクラスのSerial_close()メソッドを呼び出すだけです。簡単に済ませてしまいます。
//============================================================================= //ポートクローズの関数 void close() { //正常にクローズできたかを調べるのに使うflagです。 boolean flag; //閉じる。 flag = Serial_close(); //正常にクローズできたなら… if(flag) { tx.append("切断しました。\n\n"); } }
ファイル名は“Serial_Class.java”です。別にMainFrameクラスとかと同じjavaファイル中に記述してしまっても かまいません。
//****************************************************************************** //シリアル通信担当のクラス。Serial_Baseクラスを継承。 //****************************************************************************** class Serial_Class extends Serial_Base { //============================================================================= //クラスのフィールド JComboBox com_combo; JComboBox baud_combo; JTextArea tx; JScrollPane scrollPane; //============================================================================= //コンストラクタ Serial_Class() { //テキストエリアを作成 tx = new JTextArea(); //スクロールペインを作成して、その上にテキストエリアを貼り付けておきます。 scrollPane = new JScrollPane(tx); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //COMポート用のコンボボックスを作成して、アイテムを入れておきます。 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.setSelectedItem("COM5"); //ボー・レート用のコンボボックスを作成して、アイテムを入れておきます。 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.setSelectedItem("115200"); } //============================================================================= //ポートオープンの関数 void open() { //正常にオープンできたかを調べるのに使うflagです。 boolean flag; //コンボボックスから、選択されているCOMポート名を取得します。文字列にしておきます。 String COM_Name = (com_combo.getSelectedItem()).toString(); //コンボボックスから、選択されているボー・レートを取得します。int型に直しておきます。 int Baud_Rate = Integer.parseInt((baud_combo.getSelectedItem()).toString()); //開く。 flag = Serial_open(COM_Name,Baud_Rate); //正常にオープンできたなら… if(flag) { tx.append("接続しました。\n\n"); } } //============================================================================= //ポートクローズの関数 void close() { //正常にクローズできたかを調べるのに使うflagです。 boolean flag; //閉じる。 flag = Serial_close(); //正常にクローズできたなら… if(flag) { tx.append("切断しました。\n\n"); } } }