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

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

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

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

Q&A

2回答

6030閲覧

異なるウィンドウ間で値を参照できない

kirikiridai

総合スコア7

JavaFX

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

0グッド

0クリップ

投稿2016/08/06 07:49

編集2022/01/12 10:55

###前提・実現したいこと

JavaFXでメインウィンドウと別ウィンドウに設定画面を持ったシステムを作っています。
どちらも同じファイルControllerとしています。
設定画面に値を入力後、メインウィンドウで値を確認した所Nullが確認されました。

###発生している問題・エラーメッセージ
メインウィンドウ側で別ウィンドウ.テキストフィールド.getText()としましたがNullになってしまいます。
また、別ウィンドウで値が正しく入力された状態で、配列に値を代入しそれをメインウィンドウ側で確認してもNullになってしまいます。

別ウィンドウの値を正しく取得する方法を教えて下さい。

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

Main.java public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws IOException { AnchorPane root; root = (AnchorPane)FXMLLoader.load(getClass().getResource("sample.fxml")); Scene scene = new Scene(root,1500,700); stage.setScene(scene); stage.show(); } }
SampleController.java public class SampleController { @FXML GridPane gridp; AnchorPane syuturyokuroot; Stage syuturyokustage = new Stage(); @FXML void setteisyori() throws IOException{ syuturyokuroot = (AnchorPane)FXMLLoader.load(getClass().getResource("settei.fxml")); Scene syuturyokuscene = new Scene(syuturyokuroot,800,700); syuturyokustage.setScene(syuturyokuscene); syuturyokustage.show(); } @FXML void kakuninsyori(){ System.out.println(((TextInputControl) gridp.getChildren().get(0)).getText()); } }
sample.fxml <AnchorPane fx:id="anchor0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.SampleController"> <children> <ScrollPane fx:id="scr" hbarPolicy="ALWAYS" layoutX="73.0" layoutY="178.0" prefHeight="400.0" prefWidth="1300.0" vbarPolicy="NEVER"> <content> <AnchorPane fx:id="anchor1" minHeight="0.0" minWidth="400.0" prefHeight="400.0" prefWidth="400.0"> <children> </children> </AnchorPane> </content> </ScrollPane> <Button fx:id="btn1" layoutX="130.0" layoutY="110.0" mnemonicParsing="false" onAction="#setteisyori" text="settei" /> <Button fx:id="btntori" layoutX="244.0" layoutY="110.0" mnemonicParsing="false" onAction="#kakuninsyori" text="kakunin" /> </children> </AnchorPane>
settei.fxml <AnchorPane fx:id="anchorsyutu" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="471.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.SampleController"> <children> <ScrollPane hbarPolicy="NEVER" layoutX="56.0" layoutY="200.0" prefHeight="200.0" prefWidth="368.0" vbarPolicy="ALWAYS"> <content> <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="5005.0" prefWidth="353.0"> <children> <GridPane fx:id="gridp" gridLinesVisible="true" layoutX="1.0" layoutY="2.0" prefHeight="5000.0" prefWidth="351.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <children> <TextField text="値" GridPane.columnIndex="0" GridPane.rowIndex="0" /> </children> <rowConstraints> <RowConstraints /> </rowConstraints> </GridPane> </children> </AnchorPane> </content> </ScrollPane> </children> </AnchorPane>

###試したこと
課題に対してアプローチしたことを記載してください

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

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

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

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

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

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

guest

回答2

0

FXMLLoader によって FXML をロードすると、都度 Controller のインスタンスが生成されます。
先の方が回答されているように同じインスタンスではありません。
gridp は settei.fxml の Controller インスタンスでは有効ですが、sample.fxml では該当する
fx:id がありませんので、このインスタンスでは Null のままでしょう。

FXMLLoader.getController を使用すると生成されたControllerのインスタンスを取得できます。
setModel(SetteiModel)みたいなメソッドを設定画面側Controllerに用意し、モデルをセットして
もらい、設定画面を閉じるときにモデルのメンバを更新してはどうでしょうか。

もしくはバインディングを使っても良いかもしれません。

投稿2016/08/09 02:22

kozzy

総合スコア30

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

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

0

同じクラスだからといって同じインスタンスとは限りません。
今回のは別のインスタンスですので変数の参照は不可能です。

ブリッジするためにはモデルなどを利用してください

投稿2016/08/06 08:17

asahina_dev

総合スコア610

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

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

kirikiridai

2016/08/06 11:37

すみません、ブリッジとモデルについて調べてみましたが、実装する為の方法と要領が得られませんでした。 重ねての質問になってしまいますが、実装する為の例となるコード、または方法を教えていただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問