【问题标题】:JavaFX lssue when loading fxml file and seting its Label text加载 fxml 文件并设置其标签文本时 JavaFX lssue
【发布时间】:2018-04-18 19:07:35
【问题描述】:

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

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

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

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

为什么?因为正如您可以想象的那样,我希望当您单击包按钮时,包文件会加载所有标签,其中填充了每个项目的数量。标签是在 bag fxml 控制器上定义的,所以如果我想用一些文本填充它们,我不能从使用另一个控制器的主窗口中做到这一点,我需要通过 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);
    }

所以当我尝试从主控制器运行这个函数时,它会返回空指针异常。这意味着标签没有初始化但是当我首先输入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)

【问题讨论】:

  • 我们不是already been through this吗? cm 这里是什么? (不管是什么,显然不是你加载mochila.fxml时创建的控制器。)
  • 嗨,是的,我们做到了,但现在我已经为每个 fxml 文件制作了不同的控制器,就像你说的那样。 cm 是这样的:controladorMochila cm = new controladorMochila();它是我从 controladorMochila 创建的一个对象,它是我的包 fxml 文件的控制器
  • 对,所以cm 只是您创建的一个对象。它不是控制器。 (ControladorMochila 也不是控制器;它是一个类。控制器是一个特定的对象。)您为什么不尝试与在您链接的帖子的第一个选项中相同的方式?
  • @FXML void mochila (ActionEvent event) throws IOException, SQLException { FXMLLoader loader = new FXMLLoader(getClass().getResource("mochila.fxml")); anchorPaneContent.getChildren().setAll(pane); anchorPane2.setStyle("-fx-background-color: #3f3f3f;"); controladorMochila controller = loader.&lt;controladorMochila&gt;getController(); controller.getCantidad(); } 我试过了,但现在我该如何设置 anchorPaneContent.getChildren().setAll(loader);因为它需要是一个窗格
  • edit 提供附加信息的问题(在 cmets 中很难阅读)。我看不到您在评论中的代码中实际加载 FXML 的任何地方。请注意,我们真的不知道 anchorPaneContentanchorPane2 在这里。

标签: java javafx fxml


【解决方案1】:

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

【讨论】:

  • 我简直不敢相信,谢谢!!!!你终于解决了我的问题,这比我想象的要容易+现在我对一切都更加了解了,多亏了你。我的意思是真的谢谢你:D,这是我程序中非常重要的一部分,因为我需要不止一次地应用它。再次感谢您帮助我,感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2014-04-27
  • 2016-05-10
相关资源
最近更新 更多