web-dev-qa-db-fra.com

Exception dans la méthode de démarrage de l'application Java.lang.reflect.InvocationTargetException

Je commence tout juste avec JavaFX et j'essaie de créer une application simple avec une étiquette, un champ de texte et un bouton qui, lorsque vous cliquez dessus, définit la valeur de l'étiquette sur celle du champ de texte. Tout se passait bien jusqu'à ce que je connecte le contrôleur au fichier principal. Voici mon code:

Main.Java

package application;

import Java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;


public class Main extends Application {

    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage; // connect primary stage
        mainWindow();
    }

    // main window
    public void mainWindow() {
        try {
            // view
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/MainWindowView.fxml"));
            AnchorPane pane = loader.load();

            // controller
            MainWindowController mainWindowController = loader.getController();
            mainWindowController.setMain(this);

            // scene on stage
            Scene scene = new Scene(pane);
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

MainWindowView.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import Java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
   <children>
      <Label fx:id="label" alignment="CENTER" layoutX="291.0" layoutY="164.0" text="Label" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
      <HBox alignment="CENTER" layoutX="201.0" layoutY="208.0" spacing="20.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
         <children>
            <TextField fx:id="field" layoutX="201.0" layoutY="208.0" />
            <Button layoutX="381.0" layoutY="208.0" mnemonicParsing="false" onAction="#handleButton" text="Change Text" />
         </children>
      </HBox>
   </children>
</AnchorPane>

MainWindowController.Java

package application;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class MainWindowController {

    // views
    @FXML private Label label;
    @FXML private TextField field;

    private Main main;

    // connect main class to controller
    public void setMain(Main main) {
        this.main = main; 
    }

    // assign text field text to label on button click
    public void handleButton() {
        String text = field.getText();
        label.setText(text);
        field.clear();
    }
}

J'ai essayé plusieurs réponses trouvées sur StackOverflow, mais toutes celles que j'ai trouvées datent d'il y a 2 ans et n'ont eu aucun effet positif sur mon code. 

EDIT: trace de pile ici:

Exception in Application start method
Java.lang.reflect.InvocationTargetException
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:497)
    at com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:389)
    at com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:328)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:497)
    at Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:767)
Caused by: Java.lang.RuntimeException: Exception in Application start method
    at com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:917)
    at com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.Java:182)
    at Java.lang.Thread.run(Thread.Java:745)
Caused by: Java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:2434)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.Java:2409)
    at application.Main.mainWindow(Main.Java:27)
    at application.Main.start(Main.Java:19)
    at com.Sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.Java:863)
    at com.Sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.Java:326)
    at com.Sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.Java:295)
    at Java.security.AccessController.doPrivileged(Native Method)
    at com.Sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.Java:294)
    at com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:95)
Exception running application application.Main
3
Robert Valencia

Pour tous ceux qui ont exactement le même problème dans le futur, comme James_D et les autres contributeurs de la réponse l’ont mentionné, supprimer le "/" au début du chemin corrige le problème, alors utilisez

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));

au lieu de

FXMLLoader loader = new FXMLLoader(Main.class.getResource("/MainWindowView.fxml"));
7
Robert Valencia

devinez c'est ça?

@FXML
void handleButton(ActionEvent event) {
2
Elltz

Ce problème peut également se produire même lorsque le chemin est complètement correct.

  1. Lorsque vous créez _ le fichier fxml dans un fichier Updated IDE.

  2. Ensuite, utilisez un ancien JavaFX Scene Builder pour le design il. 

Solution :

  1. Créer le fichier fxml dans JavaFX Scane Builder

  2. Design le fichier fxml de JavaFX Scane Builder, puis copiez-le dans le IDE ou le projet.

1
Nour Noby

J'ai aussi rencontré ce cas, vous me suivez, s'il vous plaît, j'espère réussir: Outil> Options> Java> JavaFX> Accueil Scenne Buider> Changer le lien . mais il sera toujours important de démarrer JavaFX.

0
Duc Vo

L'emplacement n'est pas défini. 
Cette exception indique que votre fichier FXML est inaccessible par le code . Si votre fichier fxml est dans un package, spécifiez-le avec le nom du package. 

0
Prasanna Venkat