スポンサーリンク
スポンサーリンク

【Java】簡易マップエディタを作るPart2〜「開く」処理1〜

前回

【Java】簡易マップエディタを作るPart1〜レイアウトの作成〜

開く(画像)

 

MyCanvas・MapStageクラスの作成

MyCanvasクラス

MyCanvasクラスはCanvasクラスを継承したクラスで、マップの描画を担当します。

マップチップの幅・高さやマップの行数・列数、マップの配列(マップデータ)を保存するための変数を持ちます。

MapStageクラス

MapStageクラスはStageクラスを継承したクラスで、マップチップの選択用ウィンドウを作成します。

 

(Main.java)

 

MainクラスはMyCanvasクラスとMapStageクラスのインスタンス変数を持ちます。

基本的には、クラスとクラスのデータの受け渡しはMainクラスを介して行います。

 

(MyCanvas.java)

 

(MapStage.java)

 

(FileMenu.java)

 

BufferedImageをImageに変換

画像を切り取って読み込むには「BufferedImage」クラスの「getSubimage」関数を用いるのですが、これはSwingの機能なので返ってくる画像は「BufferedImage」型となります。

しかし、JavaFXで描画の際に使用するCanvasでは「Image」を描画することはできますが、「BufferedImage」を描画することはできません。

そのため、「getSubimage」関数で取得した「BufferedImage」は「Image」に変換する必要があります。

 

そこで、Swingの機能をJavaFXでも使いたい場合に「SwingFXUtils」クラスの関数を用います。

今回は「BufferedImage」を「Image」に変換するので「toFXImage」関数を用いて変換を行います。

 

ダイアログの作成

 

(MyDialog.java)

 

ダイアログの実装内容

ダイアログは、新しいStageを表示することで実装します。

レイアウトに関しては、「Text」を用いたテキストラベルと、「TextField」を用いた入力フォーム、そして「Button」を用いた「OK」ボタンの3つの要素で構成されます。

基本的には、「インスタンス化」→「X・Y座標、幅・高さの設定」→「Stageに追加」を行い、レイアウトを作成していきます。

 

(Main.java)

 

「Main」クラスが「MyDialog」のインスタンスを持ちます。

 

(FileMenu.java)

 

ダイアログで入力された「幅・高さ」をマップチップの幅・高さに反映させます。

 

MapStageの作成

 

ポイント

Stageの大きさはウィンドウの枠が含まれるので、後の計算に誤差を生じてしまう可能性があります。

そのため、MapStageのウィンドウの幅・高さを設定する際に、ウィンドウの枠の大きさを計算に入れます。

 

(Main.java)

 

ウィンドウの枠を計算する

ウィンドウの枠は「Insets」クラスが値を保持しているため、「Insets」クラスのインスタンスから値を取得する必要があります。

しかし、これはSwingの機能のため、JavaFXの「Insets」クラスではありません。

そのためSwingの「JFrame」クラスを用いてウィンドウを作成し(表示はしません)、枠の値を「addNotify」関数で有効にしてから、「JFrame」のインスタンスから「getInsets」関数で「Insets」クラスのインスタンスを取得します。

そして「Insets」クラスの「right・left・top・bottom」の値を取得し、各変数に代入します。

こうすることにより、ウィンドウの枠の大きさが他のクラスからでも使えるようになります。

 

(MapStage.java)

 

行なっていることは、「ウィンドウの幅・高さの設定」、「Canvasの追加」、「マップチップ・グリッドの描画」の3つです。

 

(FileMenu.java)

 

FileMenuからMapStageを開けるようにします。

 

次回

【Java】簡易マップエディタを作るPart3〜「開く」処理2〜

コメント