JavaFXで簡単なメモ帳

今回はJavaFXで簡単なメモ帳を作ってみます。

JavaFXは、JavaGUIを作成時に使う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)つまりフレームに配置されます。
建築物で例えるならば、ステージは家の基礎、シーンはフローリング、ペインは絨毯、コントロールは家具と言えるかもしれません。

f:id:astrophysik928:20190316000624p:plain



プログラム起動では、mainメソッドの中でLaunchメソッドがあります。このLaunchメソッドがオーバーライドしたstartメソッドを呼び出します。
つまり、main→launch→startの順で実行されます。

では、実際にテキストを作成してみます。完成品は次の画像のようになります。
f:id:astrophysik928:20190309224407p:plain

ソースコードは以下のようになります。


JavaFXで簡単なメモ帳

ソースコードの説明

では、重要な箇所について説明していきます。


●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」に設置した状態です。

f:id:astrophysik928:20190316132257p:plain



●MenuBarの作成、配置

//メニューバー(グローバル宣言のためmainメソッド上に配置)
MenuBar menuBar = new MenuBar();

//メニュー部生成
menuCreate();
root.setTop(menuBar);

menuCreate()メソッド実行で「保存」「終了」などのメニューバーを作成後、ボーダーレイアウト「root」の上にメニューバーを置きます。

f:id:astrophysik928:20190316132323p:plain



●新規の処理

menuCreate()メソッド内
mNew.setOnAction(Event -> newHandle());

newHandle()メソッド内
ta.clear();

メニューバーの「新規」項目に、新規ファイル作成のためのnewHandle()メソッドを設置します。「ta.clear();」でテキスト部をクリアにします。

f:id:astrophysik928:20190316132433p:plain



●既存のテキストファイルを開く処理

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(