javaFX, Scene Builder, VScodeを使用して簡単なデスクトップアプリを試作しています。
私は初心者のため、まずは簡単なプログラムを試作してみようと試みましたがスタックしてしまいました。
作りたい内容は、起動ボタンを押下したらTextFieldに"サンプルテキスト"をセットするという単純なものですが、以下のエラーが出てTextFieldがnullと認識されてしまいます。何か初歩的なミスを犯しているような気がしてあらゆるサイトをさがしましたが、解決策が見つからず困っております。わかる方いらっしゃいましたらご教授をよろしくお願いいたします。
terminal エラー内容
1起動ボタンがクリックされました 2Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 3 at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1857) 4 at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1724) 5 at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 6 at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) 7 at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 8 at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 9 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 10 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 11 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 12 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 13 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 14 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 15 at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 16 at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 17 at javafx.base@18.0.1/javafx.event.Event.fireEvent(Event.java:198) 18 at javafx.graphics@18.0.1/javafx.scene.Node.fireEvent(Node.java:8797) 19 at javafx.controls@18.0.1/javafx.scene.control.Button.fire(Button.java:203) 20 at javafx.controls@18.0.1/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208) 21 at javafx.controls@18.0.1/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) 22 at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) 23 at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 24 at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) 25 at javafx.base@18.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 26 at javafx.base@18.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 27 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 28 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 29 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 30 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 31 at javafx.base@18.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 32 at javafx.base@18.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 33 at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 34 at javafx.base@18.0.1/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 35 at javafx.base@18.0.1/javafx.event.Event.fireEvent(Event.java:198) 36 at javafx.graphics@18.0.1/javafx.scene.Scene$MouseHandler.process(Scene.java:3881) 37 at javafx.graphics@18.0.1/javafx.scene.Scene.processMouseEvent(Scene.java:1874) 38 at javafx.graphics@18.0.1/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2607) 39 at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411) 40 at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301) 41 at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) 42 at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450) 43 at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424) 44 at javafx.graphics@18.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449) 45 at javafx.graphics@18.0.1/com.sun.glass.ui.View.handleMouseEvent(View.java:551) 46 at javafx.graphics@18.0.1/com.sun.glass.ui.View.notifyMouse(View.java:937) 47 at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 48 at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) 49 at java.base/java.lang.Thread.run(Thread.java:833) 50Caused by: java.lang.reflect.InvocationTargetException 51 at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:116) 52 at java.base/java.lang.reflect.Method.invoke(Method.java:577) 53 at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:77) 54 at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) 55 at java.base/java.lang.reflect.Method.invoke(Method.java:577) 56 at javafx.base@18.0.1/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275) 57 at javafx.fxml@18.0.1/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84) 58 at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1852) 59 ... 46 more 60Caused by: java.lang.NullPointerException: Cannot invoke "javafx.scene.control.TextField.setText(String)" because "this.account" is null 61 at Controller.kidou(Controller.java:17) 62 at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) 63 ... 53 more 64PS D:\Java\cr_test>
上記の中には二つのエラー情報があり、
●Caused by: java.lang.reflect.InvocationTargetException と
●Caused by: java.lang.NullPointerException: Cannot invoke "javafx.scene.control.TextField.setText(String)" because "this.account" is null
at Controller.kidou(Controller.java:17)
ですが、一つ目のものはjavaFXで直接の原因になっているケースはほとんどないと何かのサイトにありましたので、二つ目のNullPointerExceptionが原因だと思います。TextFieldを認識していないような感じです。
fxmlファイルはScene Builderで制作したものから必要な部分を抜粋しました。今回関係しているところは起動ボタン(id = "button1")と TextField (id = "account")の部分です。
プログラムを実行すると、画面がScene Builderでデザインした画面が立ち上がります、その後起動ボタンを押すと上記のエラーとなります。起動ボタンのクリックは認識できているようです。
main.java
1import javafx.application.Application; 2import javafx.fxml.FXMLLoader; 3import javafx.scene.Parent; 4import javafx.scene.Scene; 5import javafx.stage.Stage; 6 7public class App extends Application { 8 9 //Controller controller; 10 11 public static void main(String[] args) throws Exception { 12 launch(args); 13 } 14 15 @Override 16 public void start(Stage stage) throws Exception { 17 FXMLLoader loader = new FXMLLoader(getClass().getResource("CR_test.fxml")); 18 Parent root = loader.load(); 19 //loader.setController(controller); 20 21 Scene scene = new Scene(root, 600, 500); 22 stage.setTitle("Court Resurver"); 23 stage.setScene(scene); 24 stage.show(); 25 } 26} 27
CR_test.fxml
1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.ComboBox?> 5<?import javafx.scene.control.DatePicker?> 6<?import javafx.scene.control.Label?> 7<?import javafx.scene.control.TextField?> 8<?import javafx.scene.layout.AnchorPane?> 9 10<AnchorPane id="time3" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller"> 11 <children> 12 <Label layoutX="70.0" layoutY="328.0" text="パスワード" /> 13 <Label layoutX="65.0" layoutY="297.0" text="アカウント名" /> 14 <Button id="button1" layoutX="435.0" layoutY="322.0" mnemonicParsing="false" onAction="#kidou" text="起動" /> 15 <Button id="button2" layoutX="509.0" layoutY="322.0" mnemonicParsing="false" onAction="#teishi" text="停止" /> 16 <TextField id="account" layoutX="142.0" layoutY="294.0" /> 17 <TextField id="password" layoutX="142.0" layoutY="325.0" /> 18 </children> 19</AnchorPane> 20
Controller.java
1import javafx.event.ActionEvent; 2import javafx.fxml.FXML; 3import javafx.scene.control.Button; 4import javafx.scene.control.TextField; 5 6public class Controller { 7 8 @FXML private TextField account; 9 10 @FXML private TextField password; 11 12 @FXML private Button button1; 13 14 // 起動ボタンクリック 15 @FXML private void kidou(ActionEvent event) { 16 System.out.println("起動ボタンがクリックされました"); 17 account.setText("サンプルテキスト"); 18 19 // String accountName = account.getText(); 20 // System.out.println(accountName); 21 } 22 23 // 停止ボタンクリック 24 @FXML 25 public void teishi(ActionEvent event) { 26 System.out.println("停止ボタンがクリックされました"); 27 } 28 29} 30
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/07/04 14:06