2015-03-08 3 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 не будет заменять Сцены

Исключение в методе запуска приложения Исключение в потоке «основного» 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 (Unknown Source) в 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 файл, они имеют те же атрибуты и все потому, что он был для тестирования переключателя сцены, но по какой-то причине я не может заставить его работать! Класс

Контроллер:

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

Выполнено, сообщение редактируется прямо сейчас! –

ответ

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 - правильно заполнены аннотированные поля.

Смежные вопросы