gpt4 book ai didi

java - 如何在 javafx 中使用 fxml 创建自定义弹出窗口?

转载 作者:行者123 更新时间:2023-12-02 09:02:10 37 4
gpt4 key购买 nike

GUI example

要创建新版本,系统将提示用户单击 GUI 左下角的加号按钮,当他们单击此按钮时,我希望在 GUI 中心顶部覆盖一个 Pane ,允许用户输入设置并指定新版本的选项,我已经尝试过:

 private void addRelease(Event event) throws IOException {
Popup popup = new Popup();
NewReleasePopupController controller = new NewReleasePopupController();
FXMLLoader loader = new FXMLLoader(getClass().getResource("Resources/NewReleasePopup.fxml"));
loader.setController(controller);
loader.load();
popup.getContent().add((Parent)loader.load());
}

但是,加载时似乎会抛出错误,我希望尽可能避免加载单独的阶段,并且希望将弹出窗口的 Controller 嵌套在主阶段的 Controller 中。我尝试使用弹出类,如果有人可以帮助我实现该功能或有任何更好的方法来实现此帮助,我将不胜感激!!

错误:

Caused by: javafx.fxml.LoadException: Controller value already specified.

/D:/DropDayAIO/out/生产/DropDayAIO/DropDayAIO/Resources/newReleasePopup.fxml:6

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at DropDayAIO.HomeSceneController.addRelease(HomeSceneController.java:151)
at DropDayAIO.HomeSceneController.addNewRelease(HomeSceneController.java:128)
... 57 more

最佳答案

根据您提到的错误,我认为您在 FXML 文件中已经有一个 Controller 声明。就像属性一样.. fx:controller

通常在 fxml 中有此属性声明时,如果您尝试再次设置 Controller ,它会抛出 Caused by: javafx.fxml.LoadException: Controller value already specified

我相信情况应该是这样,因为您可以注意到 processAttribute 方法引发了错误。

javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)

您可以从 fxml 中删除它,也可以不需要在代码中设置(通过 setController())。如果你说,你想要 Controller 的引用,你可以随时调用loader.getController() .

最重要的是,如果您设法解决 Controller value already specified错误,我想接下来你会遇到Caused by: javafx.fxml.LoadException: Root value already specified因为您试图调用 FXMLLoader 的 load() 方法两次。将节点分配给一个变量并使用该变量在弹出窗口中进行设置。

我相信下面的代码应该可以解决这个问题。尝试一下!!

private void addRelease(Event event) throws IOException {
Popup popup = new Popup();
FXMLLoader loader = new FXMLLoader(getClass().getResource("Resources/newReleasePopup.fxml"));
Parent parent = (Parent)loader.load(); // I am not sure you need a cast here
newReleasePopupController controller = loader.getController();
popup.getContent().add(parent);
}

建议:请使用正确的类命名约定。

关于java - 如何在 javafx 中使用 fxml 创建自定义弹出窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60082019/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com