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

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

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

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

FXML

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

Q&A

解決済

1回答

429閲覧

FXML内のNode使用方法

hilty8

総合スコア15

JavaFX

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

FXML

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

0グッド

0クリップ

投稿2018/02/23 12:20

編集2018/02/23 13:49

独学でJavaFXを学んでいる者です。初歩的な内容ですが、調べたとおりにやってもエラーが出てしまいました。ご協力いただけたら幸いです。

実行環境 - NetBeans

目的 - FXML内のPolygonオブジェクトをJavaプログラム内で変数として使用したいと考えています。

問題 - NullPointerException が出ます

実行内容
1、FXML内のGridPaneにおいてControllerを指定「 fx:controller="fxmltest.FXMLtest"」
2、使用したい要素に以下を記入「fx:id = "topButton"」
3、Javaプログラムにおいて「@FXML Polygon topButton;」と宣言
FXML内でPolygonクラスを用いて三角型のボタンを作成しています。
4、Javaプログラムにて「String str = topButton.getId();」を実行

NullPointerExceptionということは、FXMLとJavaプログラムの連携が上手くいっていないのかな、と考えてはいます。

何卒宜しくお願いします。

※追記 2/23 22:40

指摘して頂いた箇所について補足したいと思います。

1、FXMLファイル
動作 - GridPane grid = FXMLLoader.load(略); として表示した際は異常なし。
ファイル名 - ChooseDirection.fxml
ファイル内容 - 以下。閉じタグなどは省略しています。

 <GridPane fx:id="direction"
stylesheets="@ChooseDirection.css"
xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="fxmltest.FXMLtest">
GridPane内の子要素として、Polygonオブジェクトを有します。
<Polygon fx:id="upButton" stroke="BLACK" strokeType="INSIDE" styleClass="triangle">

2、Javaファイル FXMLtest.java import文などは省略しています。
public class FXMLtest extends Application {
@FXML
private Polygon downButton;
@Override
public void start(Stage stage) throws Exception {
String str = downButton.getId();
System.out.println(str);
としています。

3、initialize メソッドについて
参考にした書籍では initialize メソッドについて触れていなかったため、今回は使用していません。
一度だけ呼び出すことを明示したい際に使用すればよいもの、と認識していますが、誤りなどあればご指摘頂いたく存じます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行内容に要点は書いておられますが残念ながら若干不十分です。例えば4に「Javaプログラムにて」と書かれていますが、「どのクラスのどの部分に書かれているか」によってNPE(Null Pointer Exception)が起きる場合も起きない場合もあります。

再現する最も小さいソースコード例を作成して、

  • FXMLファイル
  • fxmltest.FXMLtest.java

を省略せずに質問に記述すると原因が推測しやすくなると思います。

いくつかの要因が想像できます。例えば

4 Javaプログラムにて「String str = topButton.getId();」を実行

1~3が適切に行えているなら、initializeメソッドの中にこう書けばNPEは起きないと思います。しかし例えばこれをstrというフィールドの宣言の場所に書いたならNGです。コントローラーのインスタンス生成時点ではtopButtonの値はまだ未設定(null)だからです。1~3の記述によってはそれが原因でNPEが起きるようなケースも考えられます。


追記:追記された内容を受けて。

###原因
コントローラークラスの使い方が間違ってます。アプリケーションクラスとコントロールクラスは別のクラスにしてください。

###対処
まず典型的な使い方覚えましょう

アプリケーションクラス:

Java

1package your.application.package; 2 3public class MyApplication extends Application { 4 @Override public void start(Stage stage) { 5 ルートノードの型 root = FXMLLoader.load(...); 6 stage.setScene(new Scene(root)); 7 stage.show(); 8 } 9}

普通は上の程度しか書くことはありません。コントローラークラスと兼用するのはNGと思ってください。(やろうとおもえばできなくはないですがかなり不自然なのでお勧めしません)

FXML:

xml

1... 2<ルートノード ... fx:controller="controller.package.MyController"> 3 ... 4 <Button fx:id="button1" onAction="#onClick1"...> 5...

コントローラークラス:(訂正2で内容を変更しました。元のコードはInitializableを実装したクラスとしていましたがそれは古いスタイルでした)

java

1package controller.package; 2 3public MyController { 4 @FXML 5 private Button button1; 6 7 public void initialize() { 8 // このメソッドで画面制御用の初期化などを行います。 9 // ここではじめて@FXMLアノテーション付きのフィールドがアクセスできます。 10 } 11 12 @FXML 13 private void onClick1() { 14 ... 15 } 16}

参考にした書籍では initialize メソッドについて触れていなかった

FXMLを用いた画面を作るというトピックでは必ずinitializeメソッドの説明があると思います。よく探してみることをお奨めします。
=>訂正2をご覧ください。


訂正2:

回答に誤りがありました。コントローラーにInitializableを実装するのは「古いやりかた」とAPIリファレンスに書いてありました。JavaFX 2.2以降は引数なしpublic void initialize()あるいは@FXML private void initialize()というメソッドを定義しておけばよいそうです。

https://www.nakamuri.info/mw/index.php/コントローラを初期化するには

大変失礼しました!

訂正3:訂正2のメソッド名の綴りが間違ってました。度々失礼しました。
×:initializable()
〇:initialize()

投稿2018/02/23 13:09

編集2018/02/24 00:33
KSwordOfHaste

総合スコア18394

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

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

hilty8

2018/02/23 13:45

ご指摘ありがとうございます。 追記しましたが、以上の内容で宜しかったでしょうか?
hilty8

2018/02/23 16:03

丁寧な指摘とわかりやすい回答、誠にありがとうございました。助かりました。 尚、参考書籍を見直しましたが、initialize メソッドの記述は見当たりませんでした。他の参考書籍や参考サイトにも目を通して勉強してみます。
KSwordOfHaste

2018/02/23 16:20 編集

> initialize メソッドの記述は見当たりませんでした。 むむ・・・すみません、InitializableインターフェースのJavaDocみてみると、自分の回答の書き方(コントローラークラスでInitializableインターフェースを実装する方法)は「古い」方法と書いてありました! 大変失礼しました。回答を少し書き直しておきます。
hilty8

2018/02/26 00:03

追記ありがとうございます! 貼り付けていただいたサイトを読んでみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問