JavaFXで簡単なメモ帳
今回はJavaFXで簡単なメモ帳を作ってみます。
JavaFXは、JavaでGUIを作成時に使うSwingを進化させたような機能です。
eclipseにscene builderというツールをインストールして、ドラッグアンドドロップでGUIを構築できるのがJavaFXの強みと言えます(ここではその手法は使いません)。
JavaFXでは、importするファイルに注意する必要があります。
「import javafx.-------」のように「fx」が付いているファイルを選ぶ必要があります。Swingの時にimportしていた「fx」がないファイルでは、実行時に不具合が生じることがあります。
文字設定といったメソッドはSwingと同様のメソッドを持っています。
.setText("String型"),.getText()などは同じです。
またGUIの部品は以下のようになります。
コントロールには、ボタンを表すButtonクラス,チェックボックスを表すCheckBoxクラスなどがありますが,これらはすべてJavaFx.scene.control.Contorolクラスを継承しています。
コントロールはペイン(pane)と呼ばれるオブジェクトの上に配置可能です。
ペインには,Swingの場合と同様にGridPane,BorderPane,FlowPane,VBox,HBoxなどがあります。
またこのペインはシーン(scene)を介して、ステージ(stage)つまりフレームに配置されます。
建築物で例えるならば、ステージは家の基礎、シーンはフローリング、ペインは絨毯、コントロールは家具と言えるかもしれません。
プログラム起動では、mainメソッドの中でLaunchメソッドがあります。このLaunchメソッドがオーバーライドしたstartメソッドを呼び出します。
つまり、main→launch→startの順で実行されます。
では、実際にテキストを作成してみます。完成品は次の画像のようになります。
ソースコードは以下のようになります。
ソースコードの説明
では、重要な箇所について説明していきます。
●TextAreaの生成
//テキスト部分(グローバル宣言のためmainメソッド上に配置)
TextArea ta = new TextArea();
//枠のサイズ設定
primaryStage.setWidth(500);
primaryStage.setHeight(300);
primaryStage.setTitle("Simple Notebook");
//ボーダーレイアウト設定
BorderPane root = new BorderPane();
//コンテナ部の設定
root.setCenter(ta);
//テキスト部追加
primaryStage.setScene(new Scene(root));
primaryStage.show();
文字などを打ち込むテキスト部をサイズを指定して、作成します。「primaryStage」がフレーム、「root」がボーダーレイアウト、「ta」がテキスト部になります。ここではボーダーレイアウト「root」の中央にテキスト部「ta」を置き、その「root」をフレーム「primaryStage」に設置した状態です。
●MenuBarの作成、配置
//メニューバー(グローバル宣言のためmainメソッド上に配置)
MenuBar menuBar = new MenuBar();
//メニュー部生成
menuCreate();
root.setTop(menuBar);
menuCreate()メソッド実行で「保存」「終了」などのメニューバーを作成後、ボーダーレイアウト「root」の上にメニューバーを置きます。
●新規の処理
menuCreate()メソッド内
mNew.setOnAction(Event -> newHandle());
newHandle()メソッド内
ta.clear();
メニューバーの「新規」項目に、新規ファイル作成のためのnewHandle()メソッドを設置します。「ta.clear();」でテキスト部をクリアにします。
●既存のテキストファイルを開く処理
menuCreate()メソッド内
mOpen.setOnAction(Event -> openHandle());
openHandle()メソッド内
//開くファイルの読み込み
FileReader fr = new FileReader(foD);
BufferedReader br = new BufferedReader(fr);
String lineStr = "";
while *1 != null) {
ta.appendText(lineStr + "\n");
}
br.close();
メニューバーの「開く」項目に、既存ファイルを開くためのopenHandle()メソッドを設置します。その後、ファイル読み取りのためのFileReaderクラスとBufferedReaderクラスのオブジェクトを生成、「ta.appendText(lineStr + "\n");」で1行ずつ改行しながら読み込みます。
●ファイルの保存処理
menuCreate()メソッド内
mSave.setOnAction(Event -> saveHandle());
saveHandle()メソッド内
//保存するファイルに書き込み
FileWriter fr = new FileWriter(fsD);
BufferedWriter bw = new BufferedWriter(fr);
String allStr = ta.getText();
String outText = allStr.split("\r\n");
for (String line : outText) {
bw.write(line);
}
bw.close();
メニューバーの「保存」項目に、保存のためのsaveHandle()メソッドを設置します。
また、FileWriterクラスとBufferedWriterクラスのオブジェクトを生成後、「String allStr = ta.getText();」でテキスト部に書かれたテキストを取得します。
そして「String outText = allStr.split("\r\n");」で1行ずつ配列に格納し、「bw.write(line);」でそれを1行ずつ書き込んでいきます。
●アプリケーション終了の処理
menuCreate()メソッド内
mExit.setOnAction(Event -> exitHandle());
メニューバーの「終了」項目に、アプリケーション終了のためのexitHandle()メソッドを設置します。
●テキスト折り返しの処理
menuCreate()メソッド内
mWrap.setOnAction(Event -> wrapHandle());
wrapHandle()メソッド内
if (mWrap.getText().equals("折り返し")) {
mWrap.setText("折り返し");
ta.setWrapText(true);
} else {
mWrap.setText("折り返し");
ta.setWrapText(false);
}
メニューバーの「折り返し」項目に、テキスト折り返しのためのwrapHandle()メソッドを設置します。「折り返し」が選択された時に「ta.setWrapText(true);」でテキスト部内で折り返しが行われます。
*1:lineStr = br.readLine(