2016-11-15 4 views
0

ich versuche, Text zu einem Textfeld hinzuzufügen, aber wenn ich auf die Schaltfläche klicke zeigt es nullpointerexception, warum ist das passiert?JavaFx - TextField.setText() werfende nullpointerException

MainWindowController.java

@FXML 
public TextField konsumatoriPunetField = new TextField(); 

@FXML 
private void initialize() 
{ 
    FXMLLoader loader5 = new FXMLLoader(); 
    loader5.setLocation(getClass().getResource("ZgjedhKonsumatorinFXML.fxml")); 
    BorderPane border5 = new BorderPane(); 
    border5 = loader5.load(); 
    Scene scene5 = new Scene(border5); 
    zgjedhkonsumatorinstage.setScene(scene5); 
    zgjedhkonsumatorinstage.setTitle("Pit Stop"); 
    zgjedhkonsumatorinstage.initModality(Modality.WINDOW_MODAL); 
    zgjedhkonsumatorinstage.initOwner(MainFXMLController.mainFXMLStage); 
} 

@FXML 
public void zgjedhKonsumatorin() 
{ 
    zgjedhkonsumatorinstage.showAndWait(); 
} 

MainWindowFXML.fxml

<TextField fx:id="konsumatoriPunetField" editable="false" onMouseClicked="#zgjedhKonsumatorin" promptText="Kliko per te zgjedhur" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 

ZgjedhKonsumatorinController.java

@FXML 
public void zgjedhKonsumatorin() 
{ 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("MainWindowFXML.fxml")); 
    MainWindowController c = (MainWindowController) loader.getController(); 
    c.konsumatoriPunetField.textProperty().setValue("ertani"); 
    main.zgjedhkonsumatorinstage.close(); 

} 

ZgjedhKonsumatorinFXML.fxml

<Button mnemonicParsing="false" onAction="#zgjedhKonsumatorin" prefWidth="150.0" text="Zgjedh Konsumatorin" /> 

Ausgang:

Caused by: java.lang.NullPointerException 
    at main.ZgjedhKonsumatorinController.zgjedhKonsumatorin(ZgjedhKonsumatorinController.java:193) 
    ... 102 more 

P. S. das ist die Linie 193 in ZgjedhKonsumatorinController (Ausnahme)

c.konsumatoriPunetField.textProperty().setValue("ertani"); 
+0

Sie Teil davon zu bearbeiten Haben Sie vergessen? Dieses Feld ist immer noch "statisch" ... –

+0

Es tut mir leid, ich habe vergessen, das hier zu bearbeiten. –

+0

Debuggen. Welches Objekt in null? – MordechayS

Antwort

1

Die Steuerung durch die FXMLLoader erstellt, wenn Sie die FXML Datei (die Controller-Klasse geladen wird durch die FXML-Datei angegeben, so ist dies das einzige Mal, es konnte erstellt werden). Wenn Sie also loader.getController() anrufen, bevor Sie load() aufrufen, ist der zurückgegebene Wert null. Daher ist c in Ihrem Code null und Sie erhalten eine Nullzeigerausnahme.

Beachten Sie, dass es nicht wirklich hilft, loader.load() hier aufzurufen. Es würde die Nullzeiger-Ausnahme beheben, aber natürlich würden Sie eine neue Instanz der Benutzeroberfläche, die von der FXML-Datei definiert wurde, und eine neue Instanz des Controllers laden. Daher würde das Textfeld, dessen Text Sie einstellen, nicht das Textfeld sein, das angezeigt wird, und nichts würde passieren.

Da Sie showAndWait() auf dem Fenster verwenden Sie erstellen, ist der einfachste Weg, um den Text zu setzen, ist es gerade in den MainWindowController zurück zu tun, nachdem der showAndWait() Aufruf abgeschlossen ist. showAndWait() blockiert die Ausführung, bis das Fenster geschlossen ist. Das Textfeld ändert sich daher erst, wenn das Fenster geschlossen wird.

Zuerst ein Verfahren in ZgjedhKonsumatorinController definieren zum Abrufen des Textes:

public class ZgjedhKonsumatorinController { 

    @FXML 
    public void zgjedhKonsumatorin() 
    { 
     main.zgjedhkonsumatorinstage.close(); 
    } 

    public String getText() { 
     // in real life you can get text from the controls in ZgjedhKonsumatorinFXML.fxml 
     return "ertani" ; 
    } 
} 

und jetzt in MainWindowController zurück können Sie tun:

public class MainWindowController { 

    @FXML 
    // Note: it is ALWAYS a mistake to initialize @FXML-injected fields. 
    // Just declare them and let the FXMLLoader initialize them 
    // (that is the whole point of @FXML) 
    private TextField konsumatoriPunetField ; 

    private ZgjedhKonsumatorinController zgjedhKonsumatorinController ; 

    @FXML 
    private void initialize() 
    { 
     FXMLLoader loader5 = new FXMLLoader(); 
     loader5.setLocation(getClass().getResource("ZgjedhKonsumatorinFXML.fxml")); 
     BorderPane border5 = new BorderPane(); 
     border5 = loader5.load(); 
     zgjedhKonsumatorinController = loader.getController(); 
     Scene scene5 = new Scene(border5); 
     zgjedhkonsumatorinstage.setScene(scene5); 
     zgjedhkonsumatorinstage.setTitle("Pit Stop"); 
     zgjedhkonsumatorinstage.initModality(Modality.WINDOW_MODAL); 
     zgjedhkonsumatorinstage.initOwner(MainFXMLController.mainFXMLStage); 
    } 

    @FXML 
    public void zgjedhKonsumatorin() 
    { 
     zgjedhkonsumatorinstage.showAndWait(); 
     konsumatoriPunetField.setText(zgjedhKonsumatorinController.getText()); 
    } 

} 
+0

Vielen Dank, ich schätze es wirklich :) Es funktioniert jetzt super! –