2014-10-22 32 views
0

當我點擊提交登錄頁面主頁按鈕應該被顯示,但我得到這個錯誤:JavaFX的錯誤,而從第1頁導航到另一個

EXCEPTION

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1768) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1651) 
    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.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Node.fireEvent(Node.java:8175) 
    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.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:204) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3746) 
    at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3471) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1695) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2486) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:314) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:243) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:345) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:526) 
    at com.sun.glass.ui.View.notifyMouse(View.java:898) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 
    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:483) 
    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:483) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1765) 
    ... 47 more 
Caused by: java.lang.NullPointerException 
    at com.emo.Navigator.showLoginPage(Navigator.java:61) 
    at com.emo.view.LoginController.authenticate(LoginController.java:37) 
    ... 57 more 

主要的應用程序

package com.emo; 

import java.io.IOException; 

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 com.emo.view.HomePageController; 
import com.emo.view.LoginController; 

public class MainApp extends Application { 

    /** 
    * Constructor 
    */ 
    @Override 
    public void start(Stage primaryStage) { 
     Navigator nav = new Navigator(); 
     nav.primaryStage = primaryStage; 
     primaryStage.setTitle("EMO APP"); 
     nav.initRootLayout(); 
     nav.showLoginPage(); 
    } 

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

登錄控制器

package com.emo.view; 

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

import com.emo.MainApp; 
import com.emo.Navigator; 

public class LoginController { 
    @FXML 
    private TextField usernameText; 
    @FXML 
    private PasswordField passwordText; 
    @FXML 
    private Label statusLabel; 
    int attempt = 0; 
    private MainApp mainApp; 

    public void setMainApp(MainApp mainApp) { 
     this.mainApp = mainApp; 
    } 

    /* 
    * @FXML void nextPane() { VistaNavigator.loadVista(VistaNavigator.VISTA_2); 
    * } 
    */ 

    @FXML 
    public void authenticate() { 
     if (attempt < 3) { 
      if (usernameText.getText().equals("abc") 
        && passwordText.getText().equals("abc")) { 
       statusLabel.setText(""); 
       Navigator nav = new Navigator(); 
       nav.showLoginPage(); 
      } else { 
       attempt++; 
       statusLabel.setText("Invalid Credentials"); 
      } 
     } else { 
      statusLabel.setText("Your account has been locked"); 
     } 

    } 
} 

首頁控制器

package com.emo.view; 

import javafx.fxml.FXML; 

import com.emo.MainApp; 

public class HomePageController { 
    // Reference to the main application. 
    private MainApp mainApp; 

    public void setMainApp(MainApp mainApp) { 
     this.mainApp = mainApp; 
    } 

    @FXML 
    public void emo() { 

    } 

    @FXML 
    public void cashManagement() { 

    } 

    @FXML 
    public void reports() { 

    } 

    @FXML 
    public void userProfile() { 

    } 

    @FXML 
    public void email() { 

    } 
} 

導航

package com.emo; 

import java.io.IOException; 

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

import com.emo.view.HomePageController; 
import com.emo.view.LoginController; 

public class Navigator { 

    Stage primaryStage; 
    BorderPane rootLayout=null; 
    FXMLLoader loader = new FXMLLoader(); 
    AnchorPane pane = null; 

    /** 
    * Returns the main stage. 
    * 
    * @return 
    */ 
    public Stage getPrimaryStage() { 
     return primaryStage; 
    } 

    /** 
    * Initializes the root layout. 
    */ 
    public void initRootLayout() { 
     try { 
      // Load root layout from fxml file. 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class 
        .getResource("view/RootLayout.fxml")); 
      rootLayout = (BorderPane) loader.load(); 

      // Show the scene containing the root layout. 
      Scene scene = new Scene(rootLayout); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Shows the Login Page inside the root layout. 
    */ 
    public void showLoginPage() { 
     try { 
      // Load person overview. 
      loader.setLocation(MainApp.class 
        .getResource("view/eMO_SignIn.fxml")); 

      pane = (AnchorPane) loader.load(); 
      // Set person overview into the center of root layout. 
      rootLayout.setCenter(pane); 

      // Give the controller access to the main app. 
      LoginController controller = loader.getController(); 
      controller.setMainApp(new MainApp()); 

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

    public void showHomePage() { 
     try { 
      pane = null; 
      // Load person overview. 
      loader.setLocation(MainApp.class 
        .getResource("view/eMO_HomePage.fxml")); 
      pane = (AnchorPane) loader.load(); 

      // Set person overview into the center of root layout. 
      rootLayout.setCenter(pane); 

      // Give the controller access to the main app. 
      HomePageController controller = loader.getController(); 
      controller.setMainApp(new MainApp()); 

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

} 

eMO_Homepage.fxml

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

<?import javafx.scene.shape.*?> 
<?import javafx.scene.effect.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.scene.image.*?> 
<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.emo.view.HomePageController"> 
    <children> 
     <ImageView fitHeight="49.0" fitWidth="250.0" layoutY="-2.0" pickOnBounds="true"> 
     <image> 
      <Image url="@../../../../../../Desktop/thCA60O0D6.jpg" /> 
     </image> 
     </ImageView> 
     <Label layoutX="27.0" layoutY="14.0" text="Home Page" textFill="#a12121"> 
     <font> 
      <Font name="System Bold" size="12.0" /> 
     </font> 
     </Label> 
     <ImageView fitHeight="354.0" fitWidth="250.0" layoutY="46.0" pickOnBounds="true"> 
     <image> 
      <Image url="@../../../../../../Desktop/thCA7ZWC4O.jpg" /> 
     </image> 
     </ImageView> 
     <Button layoutX="117.0" layoutY="10.0" mnemonicParsing="false" text="Sync" /> 
     <VBox layoutX="2.0" layoutY="50.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="50.0"> 
     <children> 
      <Button id="emo" layoutY="-1.0" mnemonicParsing="false" onAction="#emo" prefHeight="57.0" prefWidth="256.0" text="EMO"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Button> 
      <Button id="cashManagement" layoutY="56.0" mnemonicParsing="false" onAction="#cashManagement" prefHeight="57.0" prefWidth="256.0" text="Cash Management"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Button> 
      <Button id="reports" layoutY="113.0" mnemonicParsing="false" onAction="#reports" prefHeight="57.0" prefWidth="256.0" text="Reports"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Button> 
      <Button id="userProfile" layoutY="170.0" mnemonicParsing="false" onAction="#userProfile" prefHeight="57.0" prefWidth="256.0" text="User Profile"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Button> 
      <Button id="email" layoutY="227.0" mnemonicParsing="false" onAction="#email" prefHeight="57.0" prefWidth="256.0" text="Email"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Button> 
     </children> 
     </VBox> 
    </children> 
</AnchorPane> 

eMO_SignIn.fxml

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

<?import javafx.scene.text.*?> 
<?import javafx.scene.image.*?> 
<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.emo.view.LoginController"> 
    <children> 
     <ImageView fitHeight="49.0" fitWidth="250.0" layoutY="-2.0" pickOnBounds="true"> 
     <image> 
      <Image url="@../../../../Images/Grey.jpg" /> 
     </image> 
     </ImageView> 
     <Label layoutX="27.0" layoutY="14.0" text="Sign In" textFill="#a12121"> 
     <font> 
      <Font name="System Bold" size="12.0" /> 
     </font> 
     </Label> 
     <ImageView fitHeight="354.0" fitWidth="250.0" layoutY="46.0" pickOnBounds="true"> 
     <image> 
      <Image url="@../../../../Images/Red.jpg" /> 
     </image> 
     </ImageView> 
     <VBox layoutX="27.0" layoutY="79.0" spacing="5.0" AnchorPane.leftAnchor="15.0"> 
     <children> 
      <Label layoutX="27.0" layoutY="79.0" text="Username:-*" textFill="#f8e4e4"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Label> 
      <TextField fx:id="usernameText" layoutX="27.0" layoutY="105.0" prefHeight="42.0" prefWidth="150.0" /> 
      <Label layoutX="28.0" layoutY="148.0" text="Password:-*" textFill="#f8e4e4"> 
       <font> 
        <Font name="System Bold" size="12.0" /> 
       </font> 
      </Label> 
      <PasswordField fx:id="passwordText" layoutX="28.0" layoutY="174.0" prefHeight="42.0" prefWidth="150.0" /> 
     </children> 
     </VBox> 
     <Button layoutX="125.0" layoutY="236.0" mnemonicParsing="false" onAction="#authenticate" prefHeight="25.0" prefWidth="68.0" text="Sign In" AnchorPane.leftAnchor="100.0" AnchorPane.rightAnchor="82.0"> 
     <font> 
      <Font name="System Bold" size="12.0" /> 
     </font> 
     </Button> 
     <Label fx:id="statusLabel" alignment="CENTER" layoutX="46.0" layoutY="294.0" prefHeight="17.0" prefWidth="164.0" AnchorPane.bottomAnchor="100.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="280.0" /> 
    </children> 
</AnchorPane> 

RootLayout.fxml

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

<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.BorderPane?> 


<BorderPane prefHeight="400.0" prefWidth="600.0" 
    xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8"> 
    <top> 
     <MenuBar BorderPane.alignment="CENTER"> 
      <menus> 
       <Menu mnemonicParsing="false" text="File"> 
        <items> 
         <MenuItem mnemonicParsing="false" text="Close" /> 
        </items> 
       </Menu> 
       <Menu mnemonicParsing="false" text="Edit"> 
        <items> 
         <MenuItem mnemonicParsing="false" text="Delete" /> 
        </items> 
       </Menu> 
       <Menu mnemonicParsing="false" text="Help"> 
        <items> 
         <MenuItem mnemonicParsing="false" text="About" /> 
        </items> 
       </Menu> 
      </menus> 
     </MenuBar> 
    </top> 
</BorderPane> 

回答

0

LoginController.authenticate(),你這樣做:

Navigator nav = new Navigator(); 
nav.showLoginPage(); 

Navigator.showLoginPage()您有:

pane = loader.load(); 
rootLayout.setCenter(pane); 

然而,在任何時候爲rootLayoutNavigator實例初始化,這樣你就得到了NullPointerException如圖所示的堆棧跟蹤。

一個可能的解決將是給LoginController你已經創建(和正確初始化)的Navigator的引用,因此它不必創建一個新的:

public class LoginController { 

    private Navigator navigator ; 

    public void setNavigator(navigator) { 
     this.navigator = navigator ; 
    } 

    // everything else as before... 

    @FXML 
    public void authenticate() { 
     if (attempt < 3) { 
      if (usernameText.getText().equals("abc") 
        && passwordText.getText().equals("abc")) { 
       statusLabel.setText(""); 
       navigator.showLoginPage(); 
      } else { 
       attempt++; 
       statusLabel.setText("Invalid Credentials"); 
      } 
     } else { 
      statusLabel.setText("Your account has been locked"); 
     } 

    } 
} 

然後

public class Navigator { 

    // everything else as before.... 

    public void showLoginPage() { 
     try { 
      // Load person overview. 
      loader.setLocation(MainApp.class 
        .getResource("view/eMO_SignIn.fxml")); 

      pane = (AnchorPane) loader.load(); 
      // Set person overview into the center of root layout. 
      rootLayout.setCenter(pane); 

      // Give the controller access to the main app. 
      LoginController controller = loader.getController(); 
      controller.setMainApp(new MainApp()); 

      // Give the controller access to this navigator: 
      controller.setNavigator(this); 

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

} 
+0

對不起,實際上在進行身份驗證我叫Navigator nav = new Navigator(); nav.showHomePage();我仍然得到同樣的例外。確切地說, – Sam 2014-10-22 13:29:26

+0

。 'showLoginPage'假設'rootLayout'已經初始化,但沒有。 – 2014-10-22 13:30:24

+0

我甚至再次嘗試調用Navigator.initRootLayout(),但它不起作用。請幫忙。 – Sam 2014-10-22 13:32:40

相關問題