Java

JavaFXでテキストエディタを作る方法

JavaFXでは、「TextArea」というものを使って、テキスト領域を表現することができます。

今回はそれを利用して、基本的な機能をもつテキストエディタを、解説を交えながら作っていきたいと思います。

メインファイルを作成

メインファイルは「Main.java」にして、その中に「Main」クラスを作成していきます。

(Main.java)

まずは基本となるコードを載せます。

このコードでは、ただウィンドウを表示するだけですが、これを基本に様々な処理を加えていき、テキストエディタを目指していきます。

 

 コントロールを貼り付ける

ここからは、「Stage」に必要なコントロールを貼り付けていきます。

コントロールというのは、「TextArea」や「Button」などのことです。

必要なコントロール

まず必要になるコントロールを整理していきます。

MenuBar

まずはメニューが必要です。

そのために「MenuBar」でメニューを表示する領域を確保する必要があります。

Menu

この「Menu」は「ファイル」や「編集」などの部分で、「開く」や「保存」などの中身はまだありません。

この「Menu」を「MenuBar」に貼り付けていきます。

MenuItem

「Menu」の中身にあたる部分です。

「ファイル」の「開く」や「保存」などが「MenuItem」の役割です。

TextArea

これは絶対に必要です。

ここにテキストを記述していきます。

 

これで必要なコントロールは揃いました。

たったの4つなので簡単ですね。

 

コントロールを貼り付ける

Sceneの追加

それではコントロールを貼り付けていきますが、まずは「Scene」というものを用意し、そこに「Group」というものを貼り付けます。

この「Group」というものが、コントロールを管轄します。

なので、この「Group」に様々なコントロールを追加していく形になります。

(Main.java)

このように、「Group」と「Scene」を作成して、「Stage」に「Scene」を貼り付けていきます。

そして注目してほしいのが「Scene」の引数です。

「Scene」の引数には、「Group」と「int」2つがあります。

「Group」には、「Scene」に反映させたい「Group」を指定します。

次に「int」2つには、「Scene」の幅・高さを指定します。

MenuBarを追加

まずは「MenuBar」をGroupに追加していきます。

(Main.java)

「MenuBar」の幅・高さを設定するには、「setPrefWidth・Height」関数を使います。

「setWidth・Height」ではエラーになるので、ここはつまずき易いポイントだと思います。

追加するには、「Group」のコントロールリストに「MenuBar」を追加する形になります。

Menuを追加

同様に「Menu」も追加していきますが、追加する場所は「Group」ではなく「MenuBar」になるので注意です。

(Main.java)

「Menu」を「MenuBar」に追加する場合は、「getChildren」関数ではなく、「getMenus」関数を使います。

ただ、特定のリストに追加したいものを追加する形式は同じです。

MenuItemを追加

同様に、今度は「Menu」に「MenuItem」を貼り付けていきます。

(Main.java)

これに関しても、「getMenus」ではなく「getItems」なので注意です。

TextAreaを追加する

最後に「TextArea」を追加します。

 

最終的に以下の画像のようになっていれば成功です。

メニューアイテムに機能を追加

setOnAction関数で処理を追加

コントロールの貼り付けは完了したので、次は「保存」の動作を記述していきます。

メニューアイテムに動作を追加するには、「setOnAction」関数を使って処理を記述していく必要があります。

なので、まずは「保存が押されました!」と表示するプログラムを書いてみます。

(Main.java)

そうすると、「保存」を選択したタイミングで「保存が押されました!」と表示されるはずです。

ファイルを保存するプログラムを記述する

(Main.java)

ファイルの書き込みは「FileOutputStream」クラスを使います。

また、「FileOutputStream」クラスの関数は「IOException」という例外を投げるので、「try-catch文」で捕捉する必要があります。

保存するテキストの内容は「TextArea」クラスの「getText」関数を使用することで取得できます。

ただ、「write」関数の引数には「byte配列」型が入るので、「String」クラスの「getBytes」関数で「byte配列」型に変換します。

最後に「close」関数でファイルを閉じます。

この操作を行わないと、ファイルを壊してしまう危険性が生まれるので、「ファイルを開いたら閉じる」を習慣づけておきましょう。

ファイルを開くプログラムを追加する

最後にファイルを開く処理を追加します。

ただ、「開く」メニューアイテムをまだ追加していないので、コントロールを追加するところからプログラムを書いていきます。

「開く」を追加

「MenuItem」型の「menuItem」変数が既に存在しているのですが、また新しい変数名を考えるのは面倒なので、「配列」型に直します。

(Main.java)

開く処理を記述

開く処理は少し面倒なので、プログラム自体は長くなるのですが、やっていることはそこまで難しくありません。

(Main.java)

「FileInputStream」の「read」関数は1文字ずつ読み込み、文字の値を返します。

今回「put」変数と「putc」変数の両方を用意した理由は、「read」関数の返り値が「int」型であることと、「String」型の「valueOf」関数の引数が「char配列」型であることです。

そして「ArrayList<String>」型の「list」変数ですが、このリストには「putc」配列変数を「String」クラスの「valueOf」関数によって「String」型に変換した文字列(1行ずつ)が保存されていきます。

次に、読み込みがファイルの終了までに達したら、「String」型の「text」変数に「list」変数内の全ての文字列を代入し、「TextArea」に反映させます。

最後にファイルを閉じる作業も忘れずに行います。

FileChooserを追加する

最後に、「FileChooser」を追加し、開きたいファイル・保存したいファイルを選択できるようにします。

しかしアルゴリズム(仕組み)は非常に簡単で、「FileChooser」クラスのインスタンスを生成し、「showOpenDialog」関数を用いて「File」型のオブジェクトを取得するだけです。

(Main.java)

これで簡易的なテキストエディタが完成しました。

次回は、もう少し高機能なテキストエディタを目指していきます。

ここまでのプログラム

次回→まだだよ!

ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。