JavaFX 在加载 fxml 文件并设置其标签文本时 lssue



我昨天提出了一个类似的问题,但我认为它没有得到很好的解释,所以我想再问一次,但我对代码进行了一些更改。如果我写得太多,我深表歉意,但我想让一切都可以理解。

所以,我正在制作一个口袋妖怪模拟器,您可以在其中捕捉和训练口袋妖怪。 我有一个主要的 fxml 文件,其中包含访问不同 fxml 文件的按钮,如捕获、战斗、商店、包......昨天我正在做存放您所有物品的袋子。

一切正常,窗口在它们之间正确切换。当我尝试为袋子中的每个项目添加一个标签时,问题就来了,这应该向用户展示他对每个项目的好奇心。所以我创建了所有没有文本的标签,所以它们是空的。

它们将从我从数据库中获得的信息中填充,这个东西也可以正常工作,我连接到数据库并获取项目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);
}

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

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

但我完全不明白,因为我对所有这些东西都很陌生。所以伙计们,如果你能帮助我,我将不胜感激,谢谢!

编辑:

@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 是位于主窗格内的锚窗格。所有按钮都在主窗格中,根据您单击的按钮,锚窗格内容将更改为另一个 fxml 文件。我试图像我上面提到的帖子中那样做。但我不能做anchorPaneContent.getChildren().setAll(loader);因为它说:节点集全部不适用于参数(FXMLLoader)

您正在尝试将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();
}

最新更新