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

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

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

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

Q&A

解決済

1回答

2316閲覧

【JavaFX】画面を閉じる際にテキストフィールドの値を別クラスに返す方法

kntan695

総合スコア6

JavaFX

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

0グッド

0クリップ

投稿2020/03/26 14:27

JavaFXを使用してGUIアプリケーションを作成しようとしています。
その中で、複数画面を開いた動作を行う際の実装で行き詰まったので質問させていただきました。

やりたいこと

  1. メイン画面からダイアログ画面を呼び出す。
  2. ダイアログの入力フォームに文字を入力。
  3. ダイアログのOKボタンを押すとダイアログが閉じ、メイン画面のアイテムにダイアログで入力された文字列が表示される。

なお、JavaFXにはjavafx.scene.control.Dialogを利用することで簡単にダイアログを使えると思いますが、
今後自分でカスタマイズした画面で同様の処理を行いたい場面も出てきそうです。
勉強のため、javafx.scene.control.Dialogを用いなくてもできる方法を教えていただけると幸いです。

###発生している問題
以下のようなコードを書いたところNullPointerExceptionが発生し、
ダイアログ画面の入力文字列をメイン画面のコントローラで使用できない。

メイン画面(MainScreen.fxml)のコントローラ

java

1public class MainScreen { 2 3 @FXML 4 protected void makeItem(ActionEvent event) throws IOException { 5 //テーブル名入力ダイアログを表示 6 FXMLLoader loader = new FXMLLoader(getClass().getResource("Dialog.fxml")); 7 DialogScreen controller = loader.getController(); 8 AnchorPane root = (AnchorPane)loader.load(); 9 Scene scene = new Scene(root); 10 Stage stage = new Stage(); 11 stage.setScene(scene); 12 stage.showAndWait(); 13 14 String itemName = controller.getInput(); //NullPointerException発生 15 16 //以下itemNameを表示名にしたボタンを作成 17 } 18} 19

ダイアログ画面(Dialog.fxml)のコントローラ

java

1public class DiarogScreen { 2 private String input; 3 4 @FXML 5 private Button btnOK; 6 7 @FXML 8 private TextField txf; 9 10 @FXML 11 //呼び出し元アイテム:btnOK 12 //実行タイミング:OKボタン押下時 13 //処理内容:テキストフィールドの文字列をinputに格納し、ダイアログを閉じる 14 void setInputTableName(ActionEvent event){ 15 this.input = this.txf.getText(); 16 Scene scene = ((Node)event.getSource()).getScene(); 17 Window window = scene.getWindow(); 18 window.hide(); 19 } 20 21 public String getInput() { 22 return input; 23 } 24}

ダイアログ画面を閉じてしまうと、DialogScreenのコントローラにアクセスできないのが原因ではないかと考えています。
ただ、有効な打開策がわからずに今に至ります。
有効な方法がありましたら教えていただけると助かります。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

java

1 2 DialogScreen controller = loader.getController(); 3... 4public class DiarogScreen {

せめてコピペで動くソースにしてくださいよ...

java

1 DialogScreen controller = loader.getController(); 2 AnchorPane root = (AnchorPane)loader.load();

controllerは、nullでしょ?だからcontroller.getInput()でNPE。

なので、これを逆にするだけです。

JavaDocでの記載はみつけられませんでしたが、FXMLLoaderをざっと追ってみると、load()を実行したときにcontollerのインスタンスも生成されるようです。

java

1 AnchorPane root = (AnchorPane)loader.load(); 2 DialogScreen controller = loader.getController();

投稿2020/03/27 00:20

編集2020/03/27 01:29
shiketa

総合スコア3971

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

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

kntan695

2020/03/27 03:32

ソースコードの確認怠り大変失礼しました。 また、ご回答ありがとうございます。解決されました! load()を実行された際にcontrollerのインスタンスが生成されるということを理解できていませんでした。 大変助かりました。 改めて、ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問