質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2847閲覧

[JavaFX]決まったスケールで描画されたCanvasを可変なスケールに拡大したい。

Yossy_

総合スコア11

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/04/03 05:39

前提・実現したいこと

KotlinにおいてJavaFXのゲームを作ってます・。決まったスケールで描画されたCanvasを可変なスケールに拡大したい。の題の通り、
<Canvas height="720.0" width="1080.0" fx:id="canvas2"/>
に1080*720で描画をしつつ、Nodeとしては、ウィンドウのサイズに合わせるように作りたいのですがうまくいきません。

試したこと

(Kotlin)

Java

1class ControllerMCMC { 2 3 @FXML 4 lateinit var canvas1: Canvas 5 6 @FXML 7 lateinit var canvas2: Canvas//該当 8 9} 10//省略 11class <アニメーションタイマー> : AnimationTimer() { 12 13 override fun handle(now: Long) { 14 controller.canvas2.height = stage.height 15 controller.canvas2.width = 1080.000 * (stage.width/1280.000) 16 } 17}

上のように合わせていますが、これだと描画時に1080*720の外にも描画されますし拡大はできません。(あとcopySnapshotがうまく動かなかったり)

補足情報(FW/ツールのバージョンなど)

Kotlin Java8 JavaFX。Paneはfxml記述。

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以前、JavaFXのCanvasを使った世界地図を表示するプログラムの作り方についてセッションをしたときのスライド資料が次です。
世界は四角ではない~JavaFXで地図を描く

  • p.37に画面サイズにCanvasサイズを追従させるコード断片を記載しています。
  • p.52にマウスホイール操作でCanvasの描画を拡大縮小するコード断片を記載しています。

FXMLで画面レイアウトを定義していれば、FXMLのルートノードのwidthPropertyとheightPropertyをCanvasのwitdhPropertyとheightPropertyに「バインド」します。あとはウィンドウの大きさを変えるとルートノードの大きさが追随して変わり、ルートノードにバインドしたCanvasの大きさが追随して変わります。

java

1public class TinyMapViewController implements Initializable { 2 3 @FXML 4 private Canvas mapCanvas; 5 @FXML 6 private Pane rootPane; 7 8 @Override 9 public void initialize(URL url, ResourceBundle rb) { 10 mapCanvas.widthProperty().bind(rootPane.widthProperty()); 11 mapCanvas.heightProperty().bind(rootPane.heightProperty()); 12 } 13 14}

アニメーションタイマーのhandleメソッドは最大で16ms毎に呼ばれ、ここにはCanvasのgraphicsContext2Dを取り出して描画する処理を記述するのではないかと思います。

投稿2018/04/04 12:24

boochnich

総合スコア194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/04/04 13:32

一度canvasへ描画したらサイズが変化しても再描画しないという仮定でコメントしてみたのですが、 むしろcanvasの大きさを変化させ、それに応じて再描画する前提で実装しておくと刻々と描画内容が変わるような応用にもマッチするし、テキストの大きさが縮尺によってぼやけたりする問題にも対処しやすいという意味でより柔軟な方法に思えました。
guest

0

  1. width, heightを直接書き換えてもスケール(縮尺)は変わりません。縮尺を制御するにはアフィン変換行列リスト(transformsプロパティー)やscaleX, scaleYプロパティーなどを使うことになると思います。

  2. ウィンドウサイズに合わせる

ウィンドウサイズはデコレーション部分(タイトルとか)も含む大きさなので基準にするには少々やっかいな面があるかと思います。Sceneを基準にするとよいのではないでしょうか。

もしシーン全体を覆うようなキャンバスならscaleX, scaleYを用いてみるとよいと思います。

いずれにせよ座標変換は結構複雑でなかなか難解です(少なくとも自分にとってはそうです)。NodeのAPIリファレンスに座標変換に関する解説が若干ありますが、それを一通り読んでも、ちょこっと試した程度では(色々な落とし穴があるため)すんなり期待通りにはいかないことが多い気がします。またシーングラフをどういうノードで構成するかによっても振る舞いがガラっと変わったりもします。

そんなわけで質問の際には「短いけどもそのまま再現できるようなコード」を添付するのがよいと思います。

投稿2018/04/03 13:28

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問