Ich arbeite an JavaFX Projekt und ich habe einen Fehler wie folgt aus:JavaFX: Exception in thread "JavaFX Anwendung Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Logout
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:745)
Caused by: 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 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
... 52 more
Caused by: java.lang.NullPointerException
at gn.kahere.car.manager.view.DrawerContentController.logoutAction(DrawerContentController.java:56)
... 62 more
Meine MainApp.java
package gn.kahere.car.manager;
import java.io.IOException;
import gn.kahere.car.manager.view.DrawerContentController;
import gn.kahere.car.manager.view.LoginController;
import gn.kahere.car.manager.view.RootLayoutController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class MainApp extends Application {
private Stage primaryStage;
private AnchorPane rootLayout;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Car Manager");
// Prevent the window resizing
this.primaryStage.setResizable(false);
showLogin();
}
/**
* Show the login page
*/
public void showLogin() {
try {
// Load login page
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/Login.fxml"));
AnchorPane login = (AnchorPane) loader.load();
// Set the scene containing the login page
Scene scene = new Scene(login);
primaryStage.setScene(scene);
// Give the controller access to the main application
LoginController controller = loader.getController();
controller.setMainApp(this);
// Show the scene
primaryStage.show();
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* Initializes the root layout
*/
public void initRootLayout() {
try {
// Load root layout
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
rootLayout = (AnchorPane) loader.load();
// Give the controller access to the main application
RootLayoutController controller = loader.getController();
controller.setMainApp(this);
// Get the DrawerContentController
FXMLLoader drawerLoader = new FXMLLoader();
drawerLoader.setLocation(MainApp.class.getResource("view/DrawerContent.fxml"));
drawerLoader.load(); // Load the fxml file
DrawerContentController drawerController = drawerLoader.getController();
drawerController.setMainApp(this);
// Show the scene containing the root layout
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Mein RootLayoutController.java
package gn.kahere.car.manager.view;
import java.io.IOException;
import com.jfoenix.controls.JFXDrawer;
import com.jfoenix.controls.JFXHamburger;
import com.jfoenix.transitions.hamburger.HamburgerBasicCloseTransition;
import gn.kahere.car.manager.MainApp;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
public class RootLayoutController {
// Reference to the main application
@SuppressWarnings("unused")
private MainApp mainApp;
@FXML
private JFXHamburger hamburger;
@FXML
private JFXDrawer drawer;
/**
* Controller
*/
public RootLayoutController() {
}
/**
* Initializes the controller class.
*/
@FXML
private void initialize() {
try {
VBox box = FXMLLoader.load(getClass().getResource("DrawerContent.fxml"));
drawer.setSidePane(box);
HamburgerBasicCloseTransition burgerTask = new HamburgerBasicCloseTransition(hamburger);
burgerTask.setRate(-1);
hamburger.addEventHandler(MouseEvent.MOUSE_PRESSED, (e) -> {
burgerTask.setRate(burgerTask.getRate() * -1);
burgerTask.play();
if(drawer.isShown())
drawer.close();
else
drawer.open();
});
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* Is called by the main application to give a reference back to itself
*
* @param mainApp
*/
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
}
}
RootLayout.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXDrawer?>
<?import com.jfoenix.controls.JFXHamburger?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="700.0" prefWidth="1000.0" stylesheets="@style.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gn.kahere.car.manager.view.RootLayoutController">
<children>
<JFXHamburger fx:id="hamburger" layoutX="946.0" layoutY="24.0" stylesheets="@style.css" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="20.0">
<cursor>
<Cursor fx:constant="HAND" />
</cursor>
</JFXHamburger>
<JFXDrawer fx:id="drawer" defaultDrawerSize="200.0" prefHeight="700.0" prefWidth="200.0" stylesheets="@../../../../../../bin/gn/kahere/car/manager/view/style.css" AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0">
<effect>
<DropShadow />
</effect>
</JFXDrawer>
</children>
</AnchorPane>
DrawerContentController.java
package gn.kahere.car.manager.view;
import gn.kahere.car.manager.MainApp;
import javafx.fxml.FXML;
public class DrawerContentController {
// Reference to the main application
private MainApp mainApp;
/**
* Controller
*/
public DrawerContentController() {
}
@FXML
private void initialize() {
System.out.println("Drawer");
}
@FXML
private void homeAction() {
System.out.println("Home");
}
@FXML
private void addCarAction() {
System.out.println("Add Car");
}
@FXML
private void listCarsAction() {
System.out.println("List Cars");
}
@FXML
private void searchAction() {
System.out.println("Search");
}
@FXML
private void agentsAction() {
System.out.println("Agents");
}
@FXML
private void profileAction() {
System.out.println("Profile");
}
@FXML
private void logoutAction() {
System.out.println("Logout");
mainApp.showLogin();
}
/**
* Is called by the main application to give a reference back to itself
*
* @param mainApp
*/
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
}
}
DrawerContent.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import java.lang.String?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="200.0" stylesheets="@style.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gn.kahere.car.manager.view.DrawerContentController">
<children>
<Pane prefHeight="150.0" prefWidth="200.0" styleClass="side-menu-header" stylesheets="@style.css">
<children>
<Text fill="WHITE" layoutX="14.0" layoutY="131.0" strokeType="OUTSIDE" strokeWidth="0.0" text="MAMADOU ALIOU DIALLO">
<font>
<Font size="12.0" />
</font>
</Text>
<ImageView fitHeight="62.0" fitWidth="66.0" layoutX="14.0" layoutY="44.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../../../../../img/user/avatar.png" />
</image>
</ImageView>
</children>
</Pane>
<TextFlow prefHeight="18.0" prefWidth="200.0" style="-fx-background-color: #f0f8ff;" styleClass="navigation" stylesheets="@style.css">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="PRINCIPAL NAVIGATION" wrappingWidth="176.49267578125" />
</children>
</TextFlow>
<JFXButton buttonType="RAISED" onAction="#homeAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="HOME" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<Separator prefWidth="200.0" />
<JFXButton buttonType="RAISED" onAction="#addCarAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="ADD CAR" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<Separator prefWidth="200.0" />
<JFXButton buttonType="RAISED" layoutX="10.0" layoutY="196.0" onAction="#listCarsAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="LIST CARS" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<Separator prefWidth="200.0" />
<JFXButton buttonType="RAISED" layoutX="10.0" layoutY="196.0" onAction="#searchAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="SEARCH" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<TextFlow layoutX="10.0" layoutY="160.0" prefHeight="18.0" prefWidth="200.0" style="-fx-background-color: #f0f8ff;" styleClass="navigation" stylesheets="@style.css">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="MANAGER" wrappingWidth="176.49267578125" />
</children>
</TextFlow>
<JFXButton buttonType="RAISED" layoutX="10.0" layoutY="196.0" onAction="#agentsAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="AGENTS" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<Separator prefWidth="200.0" />
<JFXButton buttonType="RAISED" layoutX="10.0" layoutY="408.0" onAction="#profileAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="PROFILE" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
<Separator prefWidth="200.0" />
<JFXButton buttonType="RAISED" layoutX="10.0" layoutY="441.0" onAction="#logoutAction" prefHeight="50.0" prefWidth="199.0" style="-fx-background-color: #ff033e;" stylesheets="@style.css" text="LOGOUT" textFill="WHITE">
<font>
<Font size="16.0" />
</font>
<styleClass>
<String fx:value="menu-btn" />
<String fx:value="btn" />
</styleClass>
</JFXButton>
</children>
</VBox>
Der Fehler tritt auf, wenn ich auf der Logout-Button in DefaultContentController klicken, wird die "Logout" Meldung angezeigt wird, aber ich verstehe diesen Fehler nicht. Hilfe bitte. Thks.
Dank James_D hat es funktioniert, du hast mich gerettet. Ich habe mir gesagt, dass ich mit der Initialisierung des DrawerContentControllers in der MainApp die Klasse senden kann. Aber ich habe nichts gesehen. Danke für den Rat. – orion