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

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

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

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

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

FXML

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

Q&A

解決済

1回答

1334閲覧

FXMLからJavaFXへの要素取得時のエラー(InvocationTargetException、NullPointerException)

magutyan0814

総合スコア2

JavaFX

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

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

FXML

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

0グッド

0クリップ

投稿2022/01/02 13:14

前提・実現したいこと

SceneBuilderとJavaFXで円が既定の位置から水平方向に移動するアニメーションを作成したいと考えています。

発生している問題・エラーメッセージ

エラー文を見て調べたところ、
java.lang.reflect.InvocationTargetException から
circle1がFXMLからうまく取得できていないことが問題だと思うのですが、解決法がわかりません。

Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) Caused by: java.lang.NullPointerException: Cannot invoke "javafx.scene.shape.Circle.getLayoutX()" because "this.circle1" is null at application.Main.start(Main.java:39) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) ... 1 more Exception running application application.Main

該当のソースコード

java

1package application; 2import java.net.URL; 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.layout.Pane; 7import javafx.stage.Stage; 8import javafx.fxml.FXML; 9import javafx.scene.shape.*; 10// import javafx.animation.PathTransition; 11import javafx.animation.TranslateTransition; 12import javafx.util.Duration; 13// import javafx.animation.Transition.*; 14 15public class Main extends Application { 16 17 @FXML 18 private Circle circle1; 19 20 public static void main(String[] args) { 21 launch(args); 22 } 23 24 @Override 25 public void start(Stage primaryStage) throws Exception { 26 Path path = new Path(); 27 path.getElements().add(new MoveTo(0f, 50f)); 28 29 TranslateTransition tt = new TranslateTransition(Duration.seconds(2), circle1); 30 double c1X = circle1.getLayoutX();//エラー発生 31 // tt.setFromX(c1X); 32 // tt.setToX(c1X + 20); 33 34 35 URL location = getClass().getResource( "Main.fxml" ); 36 37 FXMLLoader fxmlLoader = new FXMLLoader( location ); 38 Pane root = (Pane) fxmlLoader.load(); 39 Scene scene = new Scene( root , 600 , 400 ); 40 primaryStage.setScene( scene ); 41 primaryStage.show(); 42 } 43}

FXML

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.Slider?> 5<?import javafx.scene.image.Image?> 6<?import javafx.scene.image.ImageView?> 7<?import javafx.scene.layout.AnchorPane?> 8<?import javafx.scene.layout.BorderPane?> 9<?import javafx.scene.layout.HBox?> 10<?import javafx.scene.shape.Circle?> 11 12<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"> 13 <top> 14 <HBox prefHeight="31.0" prefWidth="600.0" BorderPane.alignment="CENTER"> 15 <children> 16 <Button mnemonicParsing="false" text="Button" /> 17 <Button mnemonicParsing="false" text="Button" /> 18 </children> 19 </HBox> 20 </top> 21 <bottom> 22 <Slider BorderPane.alignment="CENTER" /> 23 </bottom> 24 <center> 25 <AnchorPane prefHeight="331.0" prefWidth="600.0" BorderPane.alignment="CENTER"> 26 <children> 27 <ImageView fitHeight="100.0" fitWidth="80.0" layoutX="71.0" layoutY="67.0" pickOnBounds="true" preserveRatio="true" AnchorPane.bottomAnchor="169.0" AnchorPane.leftAnchor="71.0" AnchorPane.rightAnchor="449.0" AnchorPane.topAnchor="67.0"> 28 <image> 29 <Image url="@../../img/green.png" /> 30 </image> 31 </ImageView> 32 <ImageView fitHeight="100.0" fitWidth="80.0" layoutX="260.0" layoutY="67.0" pickOnBounds="true" preserveRatio="true"> 33 <image> 34 <Image url="@../../img/red.png" /> 35 </image> 36 </ImageView> 37 <ImageView fitHeight="100.0" fitWidth="80.0" layoutX="458.0" layoutY="67.0" pickOnBounds="true" preserveRatio="true"> 38 <image> 39 <Image url="@../../img/yellow.png" /> 40 </image> 41 </ImageView> 42 <Circle fx:id="circle1" fill="#ff1f1f" layoutX="362.0" layoutY="92.0" radius="10.0" stroke="TRANSPARENT" strokeType="INSIDE" /> 43 <Circle fx:id="circle2" fill="#ff1f1f" layoutX="398.0" layoutY="92.0" radius="10.0" stroke="TRANSPARENT" strokeType="INSIDE" /> 44 <Circle fx:id="circle3" fill="#ff1f1f" layoutX="432.0" layoutY="92.0" radius="10.0" stroke="TRANSPARENT" strokeType="INSIDE" /> 45 </children> 46 </AnchorPane> 47 </center> 48</BorderPane>

試したこと

  • Main.fxmlはMain.javaと同じフォルダに入っています。

  • コメントアウトして調べた結果、

double c1X = circle1.getLayoutX(); を含めるとこのエラーが起きる事がわかりました。
恐らくうまくFXML情報を取得できていないのかなと思うのですが、私の力不足で解決できません。皆さんの知恵を貸してくださると大変助かります。

補足情報(FW/ツールのバージョンなど)

  • vscode ver1.63.2
  • JavaFX Scene Builder 17.0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

fxmlファイルの使い方が間違っている。MainクラスにFXML注釈をつけても無意味。

  1. fxmlファイルでcontroller classを指定する
  2. そのクラスを定義する
  3. FXMLLoader#getController()でそのクラスのインスタンスを取得する
  4. あとはお好きに

diff

1diff --git a/application/Main.fxml b/application/Main.fxml 2index e29add0..d48c153 100644 3--- a/application/Main.fxml 4+++ b/application/Main.fxml 5@@ -9,7 +9,7 @@ 6 <?import javafx.scene.layout.HBox?> 7 <?import javafx.scene.shape.Circle?> 8 9-<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"> 10+<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Hoge"> 11 <top> 12 <HBox prefHeight="31.0" prefWidth="600.0" BorderPane.alignment="CENTER"> 13 <children> 14diff --git a/application/Main.java b/application/Main.java 15index d0123f4..57de1ac 100644 16--- a/application/Main.java 17+++ b/application/Main.java 18@@ -14,8 +14,8 @@ import javafx.util.Duration; 19 20 public class Main extends Application { 21 22- @FXML 23- private Circle circle1; 24+ // @FXML 25+ // private Circle circle1; 26 27 public static void main(String[] args) { 28 launch(args); 29@@ -26,8 +26,6 @@ public class Main extends Application { 30 Path path = new Path(); 31 path.getElements().add(new MoveTo(0f, 50f)); 32 33- TranslateTransition tt = new TranslateTransition(Duration.seconds(2), circle1); 34- double c1X = circle1.getLayoutX();//エラー発生 35 // tt.setFromX(c1X); 36 // tt.setToX(c1X + 20); 37 38@@ -38,6 +36,11 @@ public class Main extends Application { 39 Pane root = (Pane) fxmlLoader.load(); 40 Scene scene = new Scene( root , 600 , 400 ); 41 primaryStage.setScene( scene ); 42+ 43+ final Hoge hoge = fxmlLoader.getController(); 44+ TranslateTransition tt = new TranslateTransition(Duration.seconds(2), hoge.circle1); 45+ double c1X = hoge.circle1.getLayoutX();//エラー発生 46+ 47 primaryStage.show(); 48 } 49 }

java

1package application; 2import javafx.fxml.FXML; 3import javafx.scene.shape.Circle; 4public class Hoge { 5 @FXML 6 Circle circle1; 7 @FXML 8 private Circle circle2; 9 @FXML 10 private Circle circle3; 11} 12
$ tree . ├── application │ ├── Hoge.class │ ├── Hoge.java │ ├── Main.class │ ├── Main.fxml │ └── Main.java

投稿2022/01/02 14:28

編集2022/01/02 14:29
shiketa

総合スコア3971

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

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

magutyan0814

2022/01/03 15:45

ご回答ありがとうございます。ご回答を参考に調べながらプログラムを工夫したところ、なんとかエラーが出ないところまで修正することができました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問