controller - NullPointerException (JavaFX Label.setText())

标签 controller nullpointerexception javafx label fxml

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

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

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

-鬼脸奇拉-

最佳答案

解决方案

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

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

解释

why must I set the Controller inside my Controller class? I set the controller in my fxml file this didn't work

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

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

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

在对以下问题的回答中有更多讨论:Passing Parameters JavaFX FXML .

关于controller - NullPointerException (JavaFX Label.setText()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22145327/

相关文章:

javascript - 如何在 Angular Controller 中拥有两个 $scoped 变量?

android - 在 ListView 中没有得到空指针异常的原因

任务栏中的 JavaFX 图标质量

java - 如何使用 JavaFX 将 TreeView 插入到 Accordion 中

java - javafx 应用程序的性能问题

c# - C# 中的 Model View Controller 实现

ruby-on-rails - MiniTest 认证

grails - 从Grails Controller中的集合中删除空记录

hadoop - Hadoop在减少步骤java.lang.NullPointerException时崩溃

java - nullable=false 值上的 nullPointerException