2015-03-08 114 views
1
package Data_Project; 

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

import java.io.IOException; 

public class Main extends Application { 
    public Stage window; 
    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     window = primaryStage; 
     //Scene1 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     Parent root1 = FXMLLoader.load(getClass().getResource("Admin.fxml")); 
     Controller a1 = new Controller(); 
     a1.getSubmitButton().setOnAction(e -> { 
      window.setScene(new Scene(root1,500,500)); 
     }); 
     window.setTitle("Log in"); 
     window.setScene(new Scene(root,500,500)); 
     window.show(); 
    } 


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

    } 
} 

嘿,那裏,即時通訊與此代碼錯誤,我無法弄清楚什麼是錯的。JavaFx將不會schange場景

在例外申請開始方法中的異常線程「主」 了java.lang.RuntimeException:異常中的應用啓動方法在 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875) 在 com.sun.javafx.application.LauncherImpl.lambda $ $ launchApplication 147(LauncherImpl.java:157) 在 com.sun.javafx.application.LauncherImpl $$ LAMBDA $ 1/989110044.run(未知 源)在java的.lang.Thread.run(Thread.java:745)引起的: java.lang.NullPointerException在 Data_Project.Main.start(Main.java:20)

XML:

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

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

<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Data_Project.Controller"> 
    <children> 

      <Label text="Username" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
      <TextField fx:id="userField" GridPane.columnIndex="2" GridPane.rowIndex="1" /> 
      <Label text="Password" GridPane.columnIndex="1" GridPane.rowIndex="3" /> 
      <PasswordField fx:id="passField" GridPane.columnIndex="2" GridPane.columnSpan="1" GridPane.rowIndex="3" /> 
      <Button fx:id="submitButton" onAction="#submitForm" text="Log in" GridPane.columnIndex="2" GridPane.columnSpan="2" GridPane.rowIndex="4" /> 
      <Label fx:id="errorLabel" textFill="#c30808" GridPane.columnIndex="2" GridPane.columnSpan="2" GridPane.rowIndex="6" /> 
    </children> 

</GridPane> 






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

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

<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Data_Project.Admin"> 
    <children> 

     <Label text="Username" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
     <TextField fx:id="userField" GridPane.columnIndex="2" GridPane.rowIndex="1" /> 
     <Label text="Password" GridPane.columnIndex="1" GridPane.rowIndex="3" /> 
     <PasswordField fx:id="passField" GridPane.columnIndex="2" GridPane.columnSpan="1" GridPane.rowIndex="3" /> 
     <Button fx:id="submitButton" text="Log in" GridPane.columnIndex="2" GridPane.columnSpan="2" GridPane.rowIndex="4" /> 
     <Label fx:id="errorLabel" textFill="#c30808" GridPane.columnIndex="2" GridPane.columnSpan="2" GridPane.rowIndex="6" /> 
    </children> 

</GridPane> 

的XML都是不同的文件,但是這裏顯示爲1個檔,它們具有相同的屬性和所有,因爲它是用於測試的場景切換,但由於某些原因,我不能讓它工作!

Controller類:

package Data_Project; 


import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 


public class Controller{ 
    Scene window; 
    @FXML Button submitButton; 
    @FXML TextField userField; 
    @FXML PasswordField passField; 
    @FXML Label errorLabel; 

    public void submitForm(ActionEvent actionEvent) { 
     authorizedUser user = new authorizedUser(); 
     if(!user.checkCredentials(userField.getText(), passField.getText())) 
     { 
      errorLabel.setText("Invalid credentials"); 
     } 
    } 


    public Button getSubmitButton() { 
     return submitButton; 
    } 
} 

管理員:

package Data_Project; 


import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 


public class Admin{ 
    Scene window; 
    @FXML Button submitButton; 
    @FXML TextField userField; 
    @FXML PasswordField passField; 
    @FXML Label errorLabel; 

    public Button getSubmitButton() { 
     return submitButton; 
    } 
} 
+0

完成後,現在編輯! – 2015-03-08 21:09:35

回答

0

FXMLLoader解析FXML文件,創建所述控制器類的實例(如果有指定)並注入任何@FXML -annotated字段進入該控制器實例。

如果你創建自己的控制器實例,爲你

Controller a1 = new Controller(); 

做那麼FXMLLoader什麼也不知道該實例的(怎麼會呢?)等等@FXML -annotated領域不被初始化。因此,當你調用

a1.getSubmitButton() 

返回null,所以你得到了NullPointerException

爲了解決這個問題,更換

Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 

Controller a1 = new Controller(); 

FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 
Parent root = loader.load(); 
Controller a1 = loader.getController(); 

這給你的是控制器實例FXMLLoader創建一個參考,所以它有它的@FXML - 註釋字段已正確初始化。