Javaで簡易的なメモ帳プログラムを作成してみるメモ。
今回はAWT(Abstract Window Toolkit)を使って簡単なメモ帳プログラムを作成してみます。JAVAでHello Worldを表示させたけど、次に何を勉強したらいいかわからない、という場合に良い例になると思います。
まず、import宣言を行い、メインのクラス(今回はmemoクラス)をFrameクラスを継承したクラスに変更します。
[JAVA]
// 簡易メモ帳プログラム import java.awt.*; import java.awt.event.*; // ファイルの読み込みに使用 import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; // ファイルの書き込みに使用 import java.io.IOException; import java.io.FileWriter; public class memo extends Frame { ・・・ }
次にメンバ変数を定義します。フレームとテキストエリアと扱うファイルの名前です。
[JAVA]
// メンバ変数 private Frame fr; //フレーム private TextArea ta; //テキストエリア private String filename;//ファイルの名前
メイン関数は自身をインスタンス化するだけです。
[JAVA]
// メイン関数 public static void main(String[] args) { new memo(); }
このプログラムの核となるコンストラクタを定義していきます。
最初はプログラムのタイトルと読み書きするファイル名の初期化です。
[JAVA]
// タイトルを付けてインスタンス化 fr = new Frame("簡易メモ帳"); // 変数クリア filename = "";
次にメニューバーの定義を行います。今回はfileメニューにopenとsaveがある簡単なものです。
[JAVA]
// メニューバー MenuBar mb = new MenuBar(); Menu mb_file = mb.add(new Menu("file")); MenuItem mi_open = mb_file.add(new MenuItem("open")); MenuItem mi_save = mb_file.add(new MenuItem("save"));
フレーム(フォーム)の上にパネル、パネルの上にテキストエリアを貼ります。イメージはこんな感じ。
[JAVA]
// パネル定義 Panel pn = new Panel(); pn.setLayout(new GridLayout(1,1)); // テキストエリアコントロール ta = new TextArea(""); // テキストエリアコントロールをパネルに追加 pn.add(ta); // パネルをフレームに追加 fr.add(pn);
メニューバーもフレームに追加します。
[JAVA]
// メニューバーをフレームに追加 fr.setMenuBar(mb);
フォームの表示をさせます。
[JAVA]
// フォームの表示 fr.pack(); fr.setSize(800, 600); fr.setVisible(true);
これでコンパイルして実行するとメモ帳らしきものが表示されます。
しかし、メニューをクリックしても何も起きませんし、×ボタンをクリックしても閉じることもできません。
それはイベントを登録していないからです。イベントを作成します。
閉じるイベントはWindowAdapterクラスを継承して作ります。
[JAVA]
// フォームを閉じるイベント class CloseWindowListener extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } }
メニューイベントはactionPerformed関数で受けて、押されたメニューにより分岐させ、処理します。
[JAVA]
// メニューイベント public void actionPerformed(ActionEvent e) { switch(e.getActionCommand()){ // file/openメニュー case "open": FileDialog dg = new FileDialog( (Frame)null, "file open", FileDialog.LOAD); dg.setVisible(true); filename = dg.getDirectory() + dg.getFile(); try{ File file = new File(filename); Scanner scn = new Scanner(file); ta.setText(""); while (scn.hasNextLine()){ ta.append(scn.nextLine() + "\n"); } scn.close(); } catch(FileNotFoundException err) { } break; // file/saveメニュー case "save": try{ if (filename != "") { FileWriter fw = new FileWriter(filename); fw.write(ta.getText()); fw.close(); } } catch (IOException err){ } break; } }
メニューイベントが発火するようにメモクラスの定義を書き換えます。ActionListenerインターフェースを実装させます。
[JAVA]
public class memo extends Frame implements ActionListener { // メンバ変数 private Frame fr; //フレーム private TextArea ta; //テキストエリア private String filename;//ファイルの名前 ・・・ }
メニューイベントをコンストラクタ内で登録します。注意すべきなのはメニューバーの定義より後に記載する必要があるという事です。
[JAVA]
// メニューバーのイベント登録 mi_open.addActionListener(this); mi_save.addActionListener(this);
最後にフォームを閉じるイベントをコンストラクタ内で登録します。場所はフォームの表示の手前あたりが良いと思います。
[JAVA]
// フォームのイベント登録 fr.addWindowListener(new CloseWindowListener());
全体的な流れは下記のとおりです。
[JAVA]
// 簡易メモ帳プログラム import java.awt.*; import java.awt.event.*; // ファイルの読み込みに使用 import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; // ファイルの書き込みに使用 import java.io.IOException; import java.io.FileWriter; // Frameクラスを継承 public class memo extends Frame implements ActionListener { // メンバ変数 private Frame fr; //フレーム private TextArea ta; //テキストエリア private String filename;//ファイルの名前 // メイン関数 public static void main(String[] args) { new memo(); } // コンストラクタ memo() { ・・・ } // メニューイベント public void actionPerformed(ActionEvent e) { ・・・ } // フォームを閉じるイベント class CloseWindowListener extends WindowAdapter{ ・・・ } }
詳しい処理の内容は別の機会に説明するとして、実行してみてください。さっきメニューや閉じるボタンに反応しなかった簡易メモ帳プログラムが、閉じれるようになっています。
fileメニューをクリックしてopenをクリックするとファイル選択メニューが表示されるようになっています。ここでは必ず変更してもよいテキストファイルを選んでください。するとテキストファイルが表示されます。
変更してfileメニューからsaveをクリックすると変更が保存されます。
注)改行コードを一律\nに変更してしまうため、テキストファイル以外のファイルは開かないでください。
できましたでしょうか。Hello Worldからはちょっとレベルアップしたプログラムになっていると思います。SwingのJFrameを使ってみたり、読み書きのところを書き換えてみたりするともっと良いテキストエディタが作れると思います。
もし動かない場合は、スペルミスがないか、イベントの登録を定義の前に行っていないか、などよく確かめてみてください。
最後にこのプログラムはサンプルプログラムですので、このプログラムを使用して起きるどんなトラブルにも筆者は責任を負いません。自己責任でお願いいたします。