2015-03-08 112 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 - 注释字段已正确初始化。