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

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

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

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

Java

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

Q&A

解決済

1回答

2786閲覧

JavaFXにおけるVBox子要素の条件付き表示

imohori708

総合スコア10

JavaFX

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

Java

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

0グッド

0クリップ

投稿2016/08/06 06:58

編集2016/08/06 12:17

現在Javaを学習中であり、初めてのプログラム開発のため、知識不足や間違った発言が多々あるかもしれません。
また、tearatailへの投稿が初めてであるため、作法等誤りが見受けられるかもしれません。
何卒よろしくお願いします。

###前提・実現したいこと
JavaFXにおけるゲーム開発をしておりますが、キャラクターを仲間にするたびにキャラクターの画像やステータスなどをキャラクター表示画面に順次追加していく(キャラクターの数は不定)といった画面表示を実現したいと考えています。
現状、FXMLによる描画処理を実行しようとしておりますが、仲間に加えた判定フラグをFXML側へ送る方法や、それによって特定のフォーマットをFXML側で複製し、各能力値をLabelで表示する方法が不明です。フラグ判定、複製さえ出来れば内部のラベルへキャラクターの能力値をLabel(String "<能力値の値>")等の方法で受渡して描画しようと考えています。

###発生している問題・エラーメッセージ
特にエラー等は発生していません。

###試したこと
FXMLLoaderでFXMLを使った初期画面を読み込んだ後、下記のコードを実行して画面を再描画しようとしてもVBoxやその子要素を描画することが出来ませんでした。

###該当のソースコード

public class HelloWorld02 extends Application { private static HelloWorld02 instance; private static Scene move = null; private static int WINDOW_WIDTH = 640; private static int WINDOW_HEIGHT = 480; private Stage stage; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) throws Exception { instance = this; this.stage=stage; stage.setWidth(WINDOW_WIDTH); stage.setHeight(WINDOW_HEIGHT); sendHelloController(""); stage.show(); } public static Scene initMove(Stage stage){ Group root = new Group(); move = new Scene (root, WINDOW_WIDTH, WINDOW_HEIGHT); Label label1 = new Label("test"); Button btn1 = new Button("btn"); VBox vb = new VBox(); vb.getChildren().add(label1); vb.getChildren().add(btn1); root.getChildren().add(vb); return move; } public void sendMoveController(String labelText) { stage.setTitle("Status"); MoveController controller = new MoveController(stage); this.replaceSceneContent(controller); } public void sendHelloController(String labelText) { stage.setTitle("Hello"); HelloController controller = new HelloController(labelText); this.replaceSceneContent(controller); } private void replaceSceneContent(Parent controller) { Scene scene = stage.getScene(); if (scene == null) { scene = new Scene(controller); stage.setScene(scene); } else { stage.getScene().setRoot(controller); } } public static HelloWorld02 getInstance() { return instance; } } public class MoveController extends AnchorPane implements Initializable{ @FXML private Button NextButton; @FXML private Button loadButton; private final String labelText=""; @FXML private Label label; public MoveController(Stage stage) { Scene move = HelloWorld02.initMove(stage); initFirst(stage); stage.setScene(move); stage.show(); } @FXML public void onNextButtonClicked() { HelloWorld02.getInstance().sendHelloController("ステータス"); } /* * ラベルやテキストが増えるごとにここで初期値を設定する。 * e.g. label.setText(String); * text.setText(String); */ /** * 1枚目のSceneを定義 * @param stage */ private void initFirst(Stage stage) { Group root = new Group(); Label label1 = new Label("push"); Button btn1 = new Button("push"); VBox vb = new VBox(); vb.getChildren().add(label1); vb.getChildren().add(btn1); root.getChildren().add(vb); } @Override public void initialize(URL url, ResourceBundle rb) { } } ●以下追記● public class HelloController extends AnchorPane implements Initializable{ @FXML private Button helloButton; @FXML private Label helloLabel; private int cnt; /** ラベルに表示するテキスト */ private final String labelText; public HelloController(String labelText) { this.labelText = labelText; loadFXML(); } /** * FXMLのロード */ private void loadFXML() { FXMLLoader fxmlLoader = new FXMLLoader(HelloWorld02.class.getResource("hello.fxml")); fxmlLoader.setRoot(this); // 自分自身をコントロールとして設定 fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (IOException exception) { throw new RuntimeException(exception); } } @FXML public void onHelloButtonClicked() { HelloWorld02.getInstance().sendMoveController("進む"); } @Override public void initialize(URL url, ResourceBundle rb) { // label.setText(labelText); } } ●●●●●●●●hello.fxml●●●●●●●●●●●●● <fx:root prefHeight="480.0" prefWidth="640.0" type="javafx.scene.layout.AnchorPane" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> <children> <Button fx:id="NextButton" layoutX="166.0" layoutY="407.0" mnemonicParsing="false" onAction="#onHelloButtonClicked" prefHeight="28.0" prefWidth="307.0" text="進む" /> </children> </fx:root>

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
Java8u45
Eclipse(4.6.0)

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんばんは、そもそも hello.fxmlを読み込んでいないと思いますよ?

私もそれほど詳しくないですが、以前練習で書いたソースを見てみると
こんな感じで最初にfxmlファイルを基にシーンを作成しています。

Java

1 @Override 2public void start(Stage stage) throws Exception { 3 Parent root = FXMLLoader.load(getClass().getResource("hello.fxml")); 4 Scene scene = new Scene(root); 5 stage.setScene(scene); 6 stage.show(); 7}

何を参考にして書いたソースか分かりませんが、最小限のことしか行わないプログラムを作ってもう一度確認して見てはいかがですか?

投稿2016/08/06 12:13

Mr_Roboto

総合スコア2208

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

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

imohori708

2016/08/06 12:23 編集

迅速な回答ありがとうございました。 仰るとおり、記述したコードに抜けが有りました。大変申し訳ありません。 本文を修正済みです。 初期描画はMr_Robotoさんの仰る方法で問題なく可能なんですが、画面遷移を実行しようとした際、initFirst()にて設定したlabel等を読み込んでくれず四苦八苦しております。 その点、画面の更新について回答頂けますと幸いです。 よろしくお願いします。
Mr_Roboto

2016/08/06 12:33

追記ありがとうございます。 ざっとしか見てませんが、initFirst()で作っているrootを stageにセットしていないからでは? (そのつもりで引数にしているのですよね?) 多分、Sceneを作ってそのなかにrootを入れて、 stageにセットする必要があると思いますが、 さっきも書きましたがあんまり詳しくないし未検証ですので 間違ってたらゴメンナサイ ^_^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問