2016-07-09 117 views
2

我的項目真的很簡單atm。它有兩個名爲latFieldlongField的TextField。我所要做的只是使用getText()方法打印這些字段中包含的字符串值,偶爾使用setText()方法設置它們。JavaFX控制器中的NullPointerException

請注意,我使用JavaFX場景生成器,並有一個FXMLDocumentFXMLDocumentController

FXMLDocument.fxml

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

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

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" style="-fx-background-color: #eee;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pokemongocontroller.FXMLDocumentController"> 
    <children> 
     <Label fx:id="label" layoutX="114.0" layoutY="92.0" minHeight="16" minWidth="69" /> 
     <Button id="upButton" layoutX="140.0" layoutY="84.0" mnemonicParsing="false" onAction="#upButtonClick" prefHeight="36.0" prefWidth="38.0" text="U" /> 
     <Button id="downButton" layoutX="140.0" layoutY="140.0" mnemonicParsing="false" onAction="#downButtonClick" prefHeight="36.0" prefWidth="38.0" text="D" /> 
     <Button id="leftButton" layoutX="94.0" layoutY="106.0" mnemonicParsing="false" onAction="#leftButtonClick" prefHeight="36.0" prefWidth="38.0" text="L" /> 
     <Button id="rightButton" layoutX="188.0" layoutY="106.0" mnemonicParsing="false" onAction="#rightButtonClick" prefHeight="36.0" prefWidth="38.0" text="R" /> 
     <TextField id="latField" layoutX="25.0" layoutY="27.0" prefHeight="22.0" prefWidth="69.0" text="0.0" /> 
     <TextField id="longField" layoutX="98.0" layoutY="27.0" prefHeight="22.0" prefWidth="69.0" text="0.0" /> 
     <Label layoutX="47.0" layoutY="49.0" text="Lat" /> 
     <Label layoutX="119.0" layoutY="49.0" text="Long" /> 
     <Button id="goButton" layoutX="188.0" layoutY="28.0" mnemonicParsing="false" onAction="#goButtonClick" prefHeight="28.0" prefWidth="78.0" text="GO!" /> 
     <TextField id="text" layoutX="47.0" layoutY="158.0" prefHeight="22.0" prefWidth="69.0" text="dfgdfg" /> 
    </children> 
</AnchorPane> 

FXMLDocumentController.java

public class FXMLDocumentController implements Initializable { 

    private double delta=0.00001; 
    private double latitude,longitude; 


    @FXML 
    private Button upButton,downButton,rightButton,leftButton,goButton; 
    private TextField latField; 
    private TextField longField; 

    @FXML 
    private void upButtonClick(ActionEvent event) { 
     System.out.println("You clicked U!"); 
     latitude+=delta; 
     printCoordinates(); 

    } 
    @FXML 
    private void downButtonClick(ActionEvent event) { 
     System.out.println("You clicked D!"); 
     latitude-=delta; 
     printCoordinates(); 

    } 
    @FXML 
    private void leftButtonClick(ActionEvent event) { 
     System.out.println("You clicked L!"); 
     longitude-=delta; 
     printCoordinates(); 

    } 
    @FXML 
    private void rightButtonClick(ActionEvent event) { 
     System.out.println("You clicked R!"); 
     longitude+=delta; 
     printCoordinates(); 

    } 
    @FXML 
    private void goButtonClick(ActionEvent event) { 
     System.out.println("You clicked Go!"); 
     latitude= Double.parseDouble(latField.getText()); 
     longitude= Double.parseDouble(longField.getText()); 
     printCoordinates(); 
     System.out.println(text.getText()); 

    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     latField.setText("0.0"); 
     longField.setText("0.0"); 
     latitude= Double.parseDouble(latField.getText()); 
     longitude= Double.parseDouble(longField.getText()); 
     printCoordinates(); 
     System.out.println(text.getText()); 

    }  

    private void printCoordinates(){ 
     System.out.println("Latitude: "+latitude); 
     System.out.println("Longitude: "+longitude); 
    } 

} 

我在m中得到一個空指針異常下面的線 -

latField.setText("0.0"); 

全部Stacktrace-

Exception in Application start method 
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:497) 
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 
    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:497) 
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$50/1343441044.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javafx.fxml.LoadException: 
file:/E:/PokemonGo/PokemonGoController/dist/run583471250/PokemonGoController.jar!/pokemongocontroller/FXMLDocument.fxml 

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2605) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2583) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101) 
    at pokemongocontroller.PokemonGoController.start(PokemonGoController.java:26) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$53/107178178.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/355629945.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/1823905343.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/1915503092.run(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/1963387170.run(Unknown Source) 
    ... 1 more 
Caused by: java.lang.NullPointerException 
    at pokemongocontroller.FXMLDocumentController.initialize(FXMLDocumentController.java:84) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552) 
    ... 22 more 
Exception running application myapplication.ApplicationController 
Java Result: 1 

這裏是我的ApplcationController.java

import javafx.application.Application; 
import javafx.event.EventHandler; 

import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.input.KeyEvent; 
import javafx.stage.Stage; 

/** 
* 
* @author Lomesh 
*/ 
public class ApplicationController extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));  
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

我的理解是,在FXML定義的控件都沒有注入到FXMLDocumentController.java中,但不知道爲什麼。 爲什麼?

回答

1
@FXML private Button upButton,downButton,rightButton,leftButton,goButton; 

對我而言這種方式行不通。你需要做的是這樣:

@FXML private Button upButton; 
... 
@FXML private Button goButton; 
+0

IDK你使用的是什麼java版本,但根據java規範,兩個版本在語義上是等價的。 [8.3。 Field Declarations](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3):*可以在一個FieldDeclaration中聲明多個字段,方法是使用more而不是一個宣佈者; FieldModifiers和UnannType **適用於聲明中的所有聲明符**。 [8.3.1。字段修飾符](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-FieldModifier):* FieldModifier: (之一) Annotation public ...* – fabian

+0

@FXML私人按鈕upButton,downButton,rightButton,leftButton,goButton;在Java 1.8.0_101上完美工作, –

5

(發佈代表OP)的

現在解決了。問題出在fxml文檔中的id屬性。

<TextField id="latField" layoutX="25.0" layoutY="27.0" prefHeight="22.0" prefWidth="69.0" text="0.0" /> 

如果使用場景構建器進行指定,則默認情況下會生成id屬性。我注意到在另一個工作項目中,它是fx:id。不知道場景製作者爲什麼不一致。

摘要:使用fx:id而不是id

0

這是注射問題。請確保控件的ID和@FXML控件變量名稱相同。