2016-11-15 4 views
0

im пытается добавить текст в текстовое поле, но когда я нажимаю кнопку, он показывает nullpointerexception, почему это происходит?JavaFx - TextField.setText() throwing 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" /> 

Выход:

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

P.S. это линия 193 в ZgjedhKonsumatorinController (за исключением)

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

Вы забыли изменить часть этого? Это поле по-прежнему 'static' ... –

+0

Простите, я забыл изменить это здесь. –

+0

Отладка. Какой объект в null? – MordechayS

ответ

1

Контроллер создан FXMLLoader при загрузке файла FXML (класс контроллера задается в файле FXML, так что это единственный раз, когда он мог). Поэтому, если вы вызываете loader.getController() перед вызовом load(), возвращаемое значение будет равно null. Следовательно, в вашем коде c имеет значение null, и вы получаете исключение нулевого указателя.

Обратите внимание, что это не поможет позвонить по телефону loader.load(). Он исправит исключение нулевого указателя, но, конечно, вы загрузите новый экземпляр пользовательского интерфейса, определенный файлом FXML, и новый экземпляр контроллера. Следовательно, текстовое поле, текст которого вы устанавливаете, не будет отображаемым текстовым полем, и ничего не произойдет.

Поскольку вы используете showAndWait() в окне, которое вы создаете, самый простой способ установить текст - просто сделать это обратно в MainWindowController после завершения вызова showAndWait(). showAndWait() блокирует выполнение, пока окно не будет закрыто, поэтому текстовое поле не изменится, пока окно не будет закрыто.

Сначала определите метод в ZgjedhKonsumatorinController для извлечения текста:

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" ; 
    } 
} 

и теперь назад в MainWindowController вы можете сделать:

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

Огромное вам спасибо, я действительно его оцениваю :) Он отлично работает сейчас! –

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