前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/03 15:45