【问题标题】:NullPointerException (JavaFX Label.setText())NullPointerException (JavaFX Label.setText())
【发布时间】:2014-03-03 11:17:07
【问题描述】:

我的 javaFx 应用程序有问题。每次调用 Label 的 .setText() 方法时,都会收到 NullPointerException。这是我的代码: 这是我的控制器的片段:

public class HomenizerController implements Initializable{
//ArrayList zum abspeichern der Termine in Listen Form
private ArrayList<Date> dateList = new ArrayList();
//ArrayList zum ab speichern der Aufgaben in Listen Form
private ArrayList<ToDo> toDoList = new ArrayList();
private Properties prop = null;

@FXML private Label username;

private void setWelcomeTab(){
    username.setText("A");
}

private void loadProperties(String path){
    FileInputStream fis = null;
    try {
        prop = new Properties();
        fis = new FileInputStream("src/homenizer/profiles/"+path+"/config.properties");
        prop.load(fis);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(HomenizerController.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(HomenizerController.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            if(fis != null)
                fis.close();
        } catch (IOException ex) {
            Logger.getLogger(HomenizerController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

public void startHomenizer(Stage stage, String username) throws IOException{
        Parent root = FXMLLoader.load(getClass().getResource("/homenizer/view/HomenizerView.fxml"));
        Scene scene = new Scene(root,1100,650);
        stage.setResizable(true);
        stage.setTitle("Homenizer");
        stage.setScene(scene);
        stage.show();
        loadProperties(username);
        setWelcomeTab();

    }

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

这是我的 .fxml:

<center>
    <TabPane fx:id="tabPan">
        <Tab text="Willkommen" closable="true" > 
            <VBox>
                <TitledPane text="Allgemeines" expanded="true">
                    <GridPane>
                        <Label text="Benutzername:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
                        <Label fx:id="username" GridPane.columnIndex="1" GridPane.rowIndex="0" />
                        <Label text="Termine gesamt:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
                        <Label fx:id="dates" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
                        <Label text="Aufgaben gesamt:" GridPane.columnIndex="0" GridPane.rowIndex="2" /> 
                        <Label fx:id="toDos" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                    </GridPane>
                </TitledPane>
                <TitledPane text="Aktuell" expanded="true">
                    <GridPane fx:id="actualPane"> 
                    </GridPane> 
                </TitledPane>
            </VBox>
        </Tab>
    </TabPane>
</center>

每次我想设置用户名的文本时,我都会得到这个 NULLPointerException:

Caused by: java.lang.NullPointerException
at homenizer.controller.HomenizerController.setWelcomeTab(HomenizerController.java:44)
at homenizer.controller.HomenizerController.startHomenizer(HomenizerController.java:76)
at homenizer.controller.LoginController.onStartRequest(LoginController.java:107)
... 54 more

线程“JavaFX 应用程序线程”中的异常删除目录 C:\Users\chris_000\Documents\NetBeansProjects\Homenizer\dist\run1609603179

那么,有人知道我遇到的问题吗?我找不到解决方案 :( 感谢您的每一个帮助

-GhostfaceChilla-

【问题讨论】:

    标签: controller nullpointerexception javafx label fxml


    【解决方案1】:

    解决方案

    您应该将控制器设置为 FXMLLoader。例如,在 Homenizer 启动方法中使用类似于下面的代码。

    FXMLLoader loader = new FXMLLoader(
            getClass().getResource("/homenizer/view/HomenizerView.fxml")
    );
    loader.setController(this);
    Parent root = (Parent) loader.load();
    

    说明

    为什么我必须在我的 Controller 类中设置 Controller?我在我的 fxml 文件中设置了控制器这不起作用

    因为你的 startHomenizer 方法不是静态方法,你必须已经创建了 Homenizer 类的实例,它也是一个 Controller,因为它有 @FXML 注释的成员。

    如果您只是要求 FXMLLoader 加载而没有首先将 Homenizer 的当前实例设置到 FXMLLoader 中,那么加载器将创建一个新的 Hominizer 实例,因此您最终会得到两个实例,一个由加载器创建,带有@FXML 成员已初始化,并且由您创建,但未初始化 @FXML 成员。这很令人困惑,可能不是您想要的。

    您可能想要的是 Homenizer 类的单个实例。为此,您需要将您创建的实例设置到 FXMLLoader 中,并且加载器将使用您现有的类而不是创建一个新类(只要在加载的 FXML 中没有定义fx:controller)。

    回复中有更多讨论:Passing Parameters JavaFX FXML

    【讨论】:

    • 感谢您的回答,但为什么我必须在我的控制器类中设置控制器?我在我的 fxml 文件中设置了控制器这不起作用,现在我在我的控制器类中设置了控制器,现在它工作正常。但为什么呢?
    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2017-04-04
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多