加载 fxml 文件并设置其标签文本时出现 JavaFX 问题

JavaFX lssue when loading fxml file and seting its Label text

我昨天提出了一个类似的问题,但我认为它没有得到很好的解释,所以我想再问一次,但我在我的代码中做了一些修改。如果我写得太多,我深表歉意,但我想让所有内容都易于理解。

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

一切正常,windows 在它们之间正常切换。当我试图为包中的每件物品添加标签时,问题就来了,这是为了向用户展示他对每件物品的数量。所以我创建了所有没有文本的标签,所以它们是空的。

它们将从我从数据库中获得的信息中得到填充,这东西也能正常工作,我连接到数据库并获取项目数量。当我想显示我包里的物品数量时,问题就来了 window.

为什么?因为正如您想象的那样,我希望当您单击包按钮时,包文件会加载所有标签,其中包含每件商品的数量。标签是在 bag fxml 控制器上定义的,所以如果我想用一些文本填充它们,我不能从使用另一个控制器的 main windows 来完成,我需要通过 bag 控制器来完成。

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

@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);
    }

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

调用它

所以现在我真的不知道该怎么做,这是学校的项目,但我的编程老师从未接触过 javafx,所以他们甚至不知道我在做什么。你是我唯一的希望。我试图理解这个 post: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 文件。我试着像上面提到的 post 那样做。但我不能做 anchorPaneContent.getChildren().setAll(loader); 因为它说:节点 setAll 不适用于参数(FXMLLoader)

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

此外,您试图从 FXMLLoader 中获取控制器,但实际上并未加载 FXML 文件;这不会起作用,因为控制器 class 是在 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();
}