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
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"));
devinez c'est ça?
@FXML
void handleButton(ActionEvent event) {
Ce problème peut également se produire même lorsque le chemin est complètement correct.
Lorsque vous créez _ le fichier fxml dans un fichier Updated IDE.
Ensuite, utilisez un ancien JavaFX Scene Builder pour le design il.
Solution :
Créer le fichier fxml dans JavaFX Scane Builder
Design le fichier fxml de JavaFX Scane Builder, puis copiez-le dans le IDE ou le projet.
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.
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.