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

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

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

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

Java

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

Q&A

解決済

1回答

2699閲覧

[JavaFX] Textを使ったプログラムの座標設定が無効化される

asadako

総合スコア147

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/05/19 11:44

JavaFXを現在Windowsで勉強中なのですが、Textを使ったプログラムの座標設定が無効化されます。APIリファレンスを調べてjavafx.scene.text.TextのsetXやsetYメソッドを使っているのですが・・・

Java

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.text.Text; 4import javafx.scene.layout.BorderPane; 5import javafx.scene.text.Font; 6import javafx.scene.Group; 7import javafx.scene.paint.Color; 8import javafx.scene.text.TextFlow; 9import javafx.scene.transform.Translate; 10import javafx.stage.Stage; 11 12public class Main extends Application { 13 @Override 14 public void start(Stage stage) throws Exception { 15 TextFlow textFlow = new TextFlow(); 16 Text title = new Text("テスト"); 17 title.setX(100); 18 title.setY(100); 19 title.setFont(Font.font ("Ricky Diminished", 40)); 20 title.setFill(Color.RED); 21 textFlow.getChildren().add(title); 22 Group group = new Group(textFlow); 23 Scene scene = new Scene(group, 500, 300, Color.WHITE); 24 stage.setTitle("テスト"); 25 stage.setScene(scene); 26 stage.show(); 27 } 28 public static void main(String[] args) { 29 launch(args); 30 } 31}

こちらがコードです。setX・Yを使っています。コンパイル・実行はできますが、実行すると文字が左上の端に寄ったままで、座標設定が無効化されます。そもそもsetX,setYは座標を設定するためのメソッドであるかどうかも初心者なのでわかりません。JavaFXに詳しい方、不具合の原因がわかれば教えていただけないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

TextFlowのリファレンスを見ると次のような注意書きがあります。

TextノードがTextFlow内にあるとき、一部のプロパティが無視されます。たとえば、Textノードの場所は親によって決定されるため、ノードのxプロパティおよびyプロパティは無視されます。同様に、...

つまりTextFlowの目的はさまざまな大きさ、色などが混在したテキストを行儀よく並べることなので、Textの位置は(例えx, yプロパティーで指定されていても、それを無視して)TextFlowの左上から順に自動配置されます。逆にx, yプロパティーの値が有効になる仕様では一々煩雑な位置計算をしなくてはならず却って使いづらくなると言えるでしょう。

従ってTextFlow上へ配置するTextは位置以外の属性(フォントと色など)のみを指定し、画面上の位置はTextFlow自体のレイアウト制約として設定する必要があります。

上記を踏まえたコードの例を次に示します。この例ではTextFlowの位置制約をlayoutX, layoutYプロパティーを用いて設定しています。(なお、本件の本質に関係する処理のみ残し、座標やシーンの大きさは小さめにしています)

java

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.text.Text; 4import javafx.scene.Group; 5import javafx.scene.text.TextFlow; 6import javafx.stage.Stage; 7 8public class Main extends Application { 9 @Override 10 public void start(Stage stage) throws Exception { 11 Text text = new Text("Hello"); 12 Text text2 = new Text("World"); 13 text2.setFont(Font.font(40)); 14 TextFlow textFlow = new TextFlow(text, text2); 15 textFlow.setLayoutX(20); 16 textFlow.setLayoutY(20); 17 textFlow.setBackground(new Background(new BackgroundFill(Color.LIGHTGRAY, null, null))); 18 Group group = new Group(textFlow); 19 Scene scene = new Scene(group, 250, 100); 20 stage.setTitle("text sample"); 21 stage.setScene(scene); 22 stage.show(); 23 } 24}

結果は次のようになります。TextFlowの背景をLIGHTGRAYにしているのでTextやTextFlowがどのようにレイアウトされているかが分かると思います。
イメージ説明


余談:

今回の例ではlayoutX, layoutYを使いましたが、必ずしもこのプロパティーは万能ではありません。コンテナの種類によって違いますが、大抵はlayoutX, layoutYは使わない方が自然にレイアウトできる気がします。

JavaFXのレイアウト攻略法としては、リファレンスをとことん読み、かつSceneBuilderのプレビューを利用して意図通りにレイアウトされるかを確認しながら画面を作ることをお勧めします。初心者の方はリファレンスが読みづらいので敬遠される向きも多いでしょうが、JavaFXの場合は推測でコードを書いても意図通りのレイアウトにならないことがよくあります。

投稿2017/05/19 16:48

KSwordOfHaste

総合スコア18394

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

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

asadako

2017/05/20 05:19

なるほど、一部のプロパティは無視されるのですね。layoutX,layoutYを使えば、正常に動かすことができました。リファレンスは参考にしていましたが、ScaneBuilderには、名前は知っていましたが触れていなかったので、これから少しずつ勉強していこうと思います。回答ありがとうございました。
KSwordOfHaste

2017/05/20 05:34

予想しないクラスに「例外が書いてある」こともよくあるのでややこしいですよね。SceneBuilderはちょっと前まではOracleが提供してくれてましたが今は[Gluonというサイト](http://gluonhq.com/products/scene-builder/)でOSSとして提供されてます。
asadako

2017/05/21 05:32

ScaneBuilderといえばOracleのイメージがありましたが変わったのですね。丁寧に回答、コメントしてくださってありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問