2017-08-30 9 views
1

Je veux passer si la scène entre deux FXML fichiers, mais je reçois cette erreur si je tente de démarrer l'application:Erreur de commutation Scènes avec FXML

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:498) 
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:498) 
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: javafx.fxml.LoadException: Error resolving onAction='#handleButtonAction', either the event handler is not in the Namespace or there is an error in the script. 

/C:/Users/j3Ypi/Dropbox/05_Praktikum/survey/out/production/survey/survey/view/moduleA.fxml:28 
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597) 
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103) 
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:610) 
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:770) 
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) 
at survey.Main.showModuleA(Main.java:40) 
at survey.Main.start(Main.java:24) 
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) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
... 1 more 
Exception running application survey.Main 

J'ai essayé plusieurs approches pour charger le fichier FXML, mais chaque fois la même erreur se produit. J'ai également essayé plusieurs solutions potentielles suggérées par la communauté ici mais aucune ne semble résoudre mon problème. La plupart d'entre eux ont dit que le chemin serait correct, mais je charge le même chemin dans le contrôleur que dans l'application principale et sans handleButtonAction() dans le contrôleur, les applications démarrent correctement. Je suis coincé sur cette tâche de base pendant des heures maintenant. J'utilise IDEA et voici mon code:

principal:

package survey; 

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

import java.io.IOException; 

public class Main extends Application { 

private Stage primaryStage; 
private BorderPane rootLayout; 

@Override 
public void start(Stage primaryStage) throws Exception{ 
    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle("Modul A"); 

    initRootlayout(); 

    showModuleA(); 
} 

private void initRootlayout() throws IOException{ 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Main.class.getResource("view/rootLayout.fxml")); 
     rootLayout = loader.load(); 

     Scene scene = new Scene(rootLayout); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
} 

private void showModuleA() throws IOException { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Main.class.getResource("view/moduleA.fxml")); 
     AnchorPane rootPane = loader.load(); 

     rootLayout.setCenter(rootPane); 
} 


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

Controller:

package survey.view; 

import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.stage.Stage; 

import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 

public class moduleAController implements Initializable { 

@FXML private Button bBack; 
@FXML private Button bForward; 

@FXML 
private void handleButtonAction(ActionEvent event) throws IOException{ 

    Stage stage; 
    Parent root; 

    if (event.getSource() == bBack){ 
     stage = (Stage) bBack.getScene().getWindow(); 
     root = FXMLLoader.load(getClass().getResource("view/moduleB.fxml")); 
    } else { 
     stage = (Stage) bForward.getScene().getWindow(); 
     root = FXMLLoader.load(getClass().getResource("view/moduleA.fxml")); 
    } 

    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 

} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 

} 
} 

FXML:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.RadioButton?> 
<?import javafx.scene.control.TextArea?> 
<?import javafx.scene.control.ToggleGroup?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.RowConstraints?> 

<AnchorPane fx:id="rootPane" prefHeight="470.0" prefWidth="950.0" styleClass="background" stylesheets="@DarkTheme.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="survey.view.moduleAController"> 
    <children> 
     <BorderPane layoutX="12.0" prefHeight="470.0" prefWidth="950.0"> 
     <top> 
      <GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="62.0" prefWidth="450.0" BorderPane.alignment="BOTTOM_RIGHT"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
       <rowConstraints> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
       <children> 
        <Button fx:id="bBack" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="30.0" prefWidth="110.0" text="Zurück" GridPane.columnIndex="1" /> 
        <Button fx:id="bForward" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="30.0" prefWidth="110.0" text="Vorwärts" GridPane.columnIndex="2" /> 
        <Label fx:id="lModul" text="Modul:" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> 
      </children> 
     </GridPane> 
    </top> 
     <left> 
      <GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="100.0" BorderPane.alignment="CENTER"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
       <rowConstraints> 
        <RowConstraints maxHeight="126.0" minHeight="10.0" prefHeight="95.0" vgrow="SOMETIMES" /> 
       <RowConstraints maxHeight="126.0" minHeight="10.0" prefHeight="95.0" vgrow="SOMETIMES" /> 
       <RowConstraints maxHeight="180.0" minHeight="10.0" prefHeight="104.0" vgrow="SOMETIMES" /> 
       <RowConstraints maxHeight="253.0" minHeight="10.0" prefHeight="95.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
       <children> 
        <Label fx:id="lFrageA" text="1. Frage A" GridPane.halignment="CENTER" GridPane.rowIndex="1" /> 
        <Label fx:id="lFrageB" text="2. Frage B" GridPane.halignment="CENTER" GridPane.rowIndex="2" /> 
        <Label fx:id="lFrageC" text="3. Frage C" GridPane.halignment="CENTER" GridPane.rowIndex="3" /> 
       <Label text="Modul A" GridPane.halignment="CENTER" /> 
      </children> 
     </GridPane> 
    </left> 
     <center> 
      <GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="189.0" BorderPane.alignment="CENTER"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
       <children> 
        <RadioButton fx:id="bCheckA1" mnemonicParsing="false" GridPane.halignment="CENTER" GridPane.rowIndex="1"> 
        <toggleGroup> 
         <ToggleGroup fx:id="groupA" /> 
       </toggleGroup> 
       </RadioButton> 
        <RadioButton fx:id="bCheckA2" mnemonicParsing="false" toggleGroup="$groupA" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="1" /> 
        <RadioButton fx:id="bCheckB1" mnemonicParsing="false" GridPane.halignment="CENTER" GridPane.rowIndex="2"> 
        <toggleGroup> 
         <ToggleGroup fx:id="groupB" /> 
       </toggleGroup></RadioButton> 
        <RadioButton fx:id="bCheckB2" mnemonicParsing="false" toggleGroup="$groupB" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="2" /> 
        <RadioButton fx:id="bCheckC1" mnemonicParsing="false" GridPane.halignment="CENTER" GridPane.rowIndex="3"> 
        <toggleGroup> 
         <ToggleGroup fx:id="groupC" /> 
       </toggleGroup></RadioButton> 
        <RadioButton fx:id="bCheckC2" mnemonicParsing="false" toggleGroup="$groupC" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="3" /> 
        <Label fx:id="lTrue" text="trifft zu" GridPane.halignment="CENTER" /> 
        <Label fx:id="lFalse" text="trifft nicht zu" GridPane.columnIndex="1" GridPane.halignment="CENTER" /> 
      </children> 
     </GridPane> 
    </center> 
     <bottom> 
      <GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="62.0" prefWidth="600.0" BorderPane.alignment="BOTTOM_CENTER"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
       <rowConstraints> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
       <children> 
        <Button mnemonicParsing="false" prefHeight="30.0" prefWidth="160.0" text="Neue Befragung" GridPane.halignment="CENTER" /> 
        <Button fx:id="bSave" mnemonicParsing="false" prefHeight="30.0" prefWidth="130.0" text="Speichern" GridPane.columnIndex="1" GridPane.halignment="CENTER" /> 
        <Button mnemonicParsing="false" prefHeight="30.0" prefWidth="130.0" text="Auswertung" GridPane.columnIndex="2" GridPane.halignment="CENTER" /> 
      </children> 
     </GridPane> 
    </bottom> 
     <right> 
      <GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="300.0" BorderPane.alignment="CENTER_RIGHT"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
       <children> 
        <TextArea maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="70.0" prefWidth="250.0" GridPane.rowIndex="1" /> 
        <TextArea maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="70.0" prefWidth="250.0" GridPane.rowIndex="2" /> 
        <TextArea maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="70.0" prefWidth="250.0" GridPane.rowIndex="3" /> 
        <Label text="Kommentar" /> 
      </children> 
     </GridPane> 
    </right> 
    </BorderPane> 
</children> 
</AnchorPane> 

Je vous remercie de toute aide. Merci d'avance!

EDIT: Outre la mauvaise importation d'action de l'événement il y a eu une erreur dans le chemin. Le contrôleur se trouve dans le dossier de vue de sorte que le chemin est juste moduleB.fxml pas vue/moduleB.fxml.

Merci pour l'aide!

Répondre

1

La solution pour votre deuxième problème est le suivant:

root = FXMLLoader.load(getClass().getClassLoader().getResource("xxx/yyy/view/moduleB.fxml)" 

où xxx et yyy est la structure du package de votre projet java. Par exemple src/foo/var/voir/moduleB.fxml -> "foo/var/view/moduleB.fxml"

La raison pour laquelle vous essayez de le charger au moment de l'exécution, et vous devez ajouter getClassLoader() else vous obtiendrez le chemin de classe réel depuis le contrôleur car vous appelez la méthode getClass() dans le contrôleur. C'est la raison pour laquelle il ne trouve pas votre fichier fxml. Il s'attend à ce qu'il soit dans le paquet de vue sous-jacent au paquet de votre contrôleur. J'espère que cela fonctionne maintenant :)

Premier problème:

Vous avez obtenu une petite erreur dans le script du contrôleur. Vous avez importé le mauvais ActionEvent. Vous avez importé

import java.awt.event.ActionEvent;

mais que vous devez importer

import javafx.event.ActionEvent;

Cela devrait corriger.

+0

Oh mon dieu vous avez raison! Merci. Mais il y avait en fait une autre erreur. Le contrôleur n'est pas dans le dossier principal mais dans le dossier de vue. Ainsi, le chemin était erroné en plus de la mauvaise importation de l'ActionEvent. – jeypeu