2015-02-07 4 views
0

Я пытался выяснить, как обращаться с файлом FXML в другом файле FXML. Но у меня есть исключение. :( Это мой внутренний FXML (NewInside.fxml в вид упаковки):java.lang.NullPointerException при обработке с FXML внутри другого FXML в Javafx

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

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


<AnchorPane prefHeight="305.0" prefWidth="360.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="controller.NewInsideController"> 
    <children> 
     <Button fx:id="newBtn" layoutX="30.0" layoutY="202.0" mnemonicParsing="false" onAction="#btnClick" text="Button" /> 
     <TextField fx:id="newTxt" layoutX="30.0" layoutY="134.0" prefHeight="25.0" prefWidth="280.0" /> 
     <Label fx:id="newLbl" layoutX="30.0" layoutY="62.0" prefHeight="17.0" prefWidth="280.0" /> 
    </children> 
</AnchorPane> 

Это его контроллер (NewInsideController.java в пакете контроллера):

package controller; 

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 

public class NewInsideController implements Initializable{ 

    @FXML public static Label newLbl; 
    @FXML public static TextField newTxt; 
    @FXML public static Button newBtn; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 

    @FXML 
    private void btnClick(ActionEvent e){ 
     System.out.println("Button is clicked!"); 
     newLbl.setText(newTxt.getText()); 
    } 

} 

И это внешняя FXML (New.fxml в вид упаковки):

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

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


<AnchorPane prefHeight="380.0" prefWidth="529.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="controller.NewController"> 
    <children> 
     <fx:include source="NewInside.fxml" /> 
    </children> 
</AnchorPane> 

Это его контроллер (NewController.java в пакете контроллера):

package controller; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 

public class NewController implements Initializable { 

    /*@FXML private Label newLbl; 
    @FXML private Button newBtn; 
    @FXML private TextField newTxt; 
    */ 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 

    /*@FXML 
    public void btnClick(ActionEvent e){ 
     newLbl.setText(newTxt.getText()); 
    }*/ 

} 

Наконец, это Main.java в пакет прикладных программ:

package application; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.stage.Stage; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      Parent root = FXMLLoader.load(getClass().getResource("/view/New.fxml")); 
      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Когда я нажал на кнопку, она дает мне очень длинное исключение: «Исключение в потоке„JavaFX Применение Нить“Java. lang.RuntimeException: java.lang.reflect.InvocationTargetException .... ..... Вызванный: java.lang.NullPointerException на controller.NewInsideController.btnClick (NewInsideController.java:27) ... больше 57 "

Пожалуйста, помогите мне! :(

+2

Я только начинающим, но только предположение: удалить слово статического из них FXML-переменные? – Inge

ответ

1

Как следует @Inge, используя статическое поле не является правильным способом это сделать. Кроме того, вместо public, вы должны использовать private. Если необходимо выставить элементы управления, использовать их свойства.

Вы можете прочитать, почему здесь:

Просто измените это в NewInsideController:

@FXML private Label newLbl; 
@FXML private TextField newTxt; 
@FXML private Button newBtn; 

EDIT

Если вы хотите иметь доступ к элементам управления из других классов, вместо того, чтобы добавлять геттеры/сеттеры, чтобы разоблачить непосредственно элементы управления, то лучше просто разоблачая их свойства.

Например, чтобы получить доступ к тексту этих элементов управления можно добавить:

public StringProperty newLblText() { 
    return newLbl.textProperty(); 
} 
public StringProperty newTxtText() { 
    return newTxt.textProperty(); 
} 
public StringProperty newBtnText() { 
    return newBtn.textProperty(); 
} 

Это позволит вам связывания (или прослушивания изменений), получение/установка свойства текста из любого из них из вне вашего контроллера.

Чтобы получить действительный экземпляр NewInsideController от NewController, перейдите по этой ссылке link.Во-первых изменить New.fxml:

<fx:include fx:id="newInside" source="NewInside.fxml" /> 

и теперь вы можете получить экземпляр, и добавить несколько слушателей с этими свойствами:

public class NewController implements Initializable { 

    @FXML 
    private Parent newInside; 
    @FXML 
    private NewInsideController newInsideController; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     newInsideController.newBtnText().addListener(
      (obs,s,s1)->System.out.println("nweBtn Text;" +s1)); 
     if(newInsideController.newLblText().get().isEmpty()){ 
      newInsideController.newLblText().set("Text for the textfield"); 
     } 
     newInsideController.newTxtText().addListener(
      (obs,s,s1)->System.out.println("s1 "+s1)); 
    }  
} 
+0

Что вы подразумеваете под «Если вам нужно выставить свои элементы управления, используйте их свойства»? Не могли бы вы объяснить мне это? – Yin

+0

Я только что отредактировал свой ответ, добавив объяснение. –

+0

Где я должен поместить последний кусок кода? Является ли он в классе контроллера? – Yin

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