JavaFX在加载fxml文件并设置其Label文本时发出错误

时间:2018-04-18 19:07:35

标签: java javafx fxml

昨天我提出了一个类似的问题,但我认为它没有得到很好的解释,所以我想再问一遍,但我在代码中做了一些改动。如果我写得太多,我会道歉,但我想让一切都变得可以理解。

所以,我正在制作一个口袋妖怪模拟器,你可以捕捉和训练口袋妖怪。 我有一个主要的fxml文件,其中包含用于访问不同fxml文件的按钮,如catch,battle,shop, bag ... 昨天我正在做所有物品存放的包。

一切正常,窗户正常切换。当我试图为包中的每个项目添加一个标签时出现问题,该标签用于向用户显示每个项目的每个项目。所以我创建了没有文字的所有标签,所以它们都是空的。

他们将从我从数据库获得的信息填充,这个东西也正常工作,我连接到数据库并获得项目cuantity。当我想在我的包窗口中显示该项目时,问题就来了。

为什么呢?因为你可以想象,当你点击行李按钮时,我想要的是,行李文件会加载所有标签,每个标签都填满了每个项目。标签是在包fxml控制器上定义的,所以如果我想用一些文本填充它们,我不能从我使用另一个控制器的主窗口进行,我需要通过包控制器来完成。

这是我试图使其工作的代码(位于主控制器中):

@FXML
    void mochila (ActionEvent event) throws IOException, SQLException {
        AnchorPane pane = FXMLLoader.load(getClass().getResource("mochila.fxml"));
        anchorPaneContent.getChildren().setAll(pane);
        anchorPane2.setStyle("-fx-background-color: #3f3f3f;");
        cm.getCantidad();
    }

getCantidad是我的包控制器中的一个功能,就是这样:

public void getCantidad() {
        lblpokeballCount.setText("Cantidad: "+pokeballcount);
        lblsuperballCount.setText("Cantidad: "+superballcount);
        lblultraballCount.setText("Cantidad: "+ultraballcount);
        lblmasterballCount.setText("Cantidad: "+masterballcount);
    }

因此,当我尝试从主控制器运行此函数时,它返回空指针异常。这意味着标签没有初始化,但是当我首先输入AnchorPane pane = FXMLLoader.load(getClass().getResource("mochila.fxml"));时,Shoudlnt会加载文件中的所有资源吗? 因为我在我的包文件中创建了一个按钮,当点击时运行相同的功能,并且它正常工作,因为我从同一个控制器/文件中调用它。

所以现在我真的不知道该怎么做,这是一个学校的项目,但我的编程老师从未接触过javafx所以他们甚至不知道我在做什么。你是我唯一的希望。我试着理解这篇文章:post

但我完全不了解它,因为我对这些东西都是新手。所以,如果你能帮助我,我会非常感激,谢谢!

修改

@FXML
    void mochila (ActionEvent event) throws IOException, SQLException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("mochila.fxml"));
        anchorPaneContent.getChildren().setAll(loader);
        controladorMochila controller = loader.<controladorMochila>getController();
        controller.getCantidad();
    }

anchorPaneContent是主窗格内的一个锚定窗格。所有按钮都在主窗格中,根据您单击的按钮,anchorpanecontent将更改为另一个fxml文件。我试着在上面提到的帖子中这样做。但我不能anchorPaneContent.getChildren().setAll(loader);,因为它说:节点setAll不适用于参数(FXMLLoader)

1 个答案:

答案 0 :(得分:0)

您正尝试将FXMLLoader添加到锚定窗格,这不起作用,因为FXMLLoader不是可视组件(它是加载FXML文件的东西)。

此外,您正试图从FXMLLoader获取控制器而不实际加载FXML文件;这不会起作用,因为控制器类是在FXML文件中指定的(因此FXMLLoader不知道在加载文件之前要创建哪种控制器。)

您需要加载FXML文件并将结果添加到锚点窗格:

@FXML
void mochila (ActionEvent event) throws IOException, SQLException {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("mochila.fxml"));
    anchorPaneContent.getChildren().setAll(loader.load());
    controladorMochila controller = loader.<controladorMochila>getController();
    controller.getCantidad();
}

或者,如果你想更明确一点:

@FXML
void mochila (ActionEvent event) throws IOException, SQLException {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("mochila.fxml"));
    Parent pane = loader.load();
    anchorPaneContent.getChildren().setAll(pane);
    controladorMochila controller = loader.<controladorMochila>getController();
    controller.getCantidad();
}