以编程方式设置控制器时“没有为***元素指定控制器”
Posted
技术标签:
【中文标题】以编程方式设置控制器时“没有为***元素指定控制器”【英文标题】:"No Controller specified for top level element" when programatically setting a Controller 【发布时间】:2015-12-28 08:34:22 【问题描述】:我有一个 FXML 文件,其中包含带有 onMouseClicked 属性的按钮。我没有在 FXML 中设置控制器,因为我有构造函数注入的数据,我想提供给控制器。
<Button mnemonicParsing="false" onMouseClicked="#newWidgetRequestButtonClicked" text="New Widget..." />
我正在以编程方式设置控制器,并且我的控制器包含 FXML 中指定的方法。控制器功能执行,一切正常。
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
MyController controller = new MyController(...);
loader.setController(controller);
我的问题在于 IntelliJ 对 .fxml 文件的检查。每次出现函数引用时,它都会报告“错误:(45, 54) 没有为***元素指定控制器”。我正在查看 IntelliJ 的检查规则,但在 JavaFX 部分中没有看到此规则。同样,程序构建和运行都很好,所以它不是真正的编译错误。我想禁用此错误通知。
我怎样才能避免这个错误?
【问题讨论】:
我遇到了同样的问题。有没有办法向 JetBrains 报告此问题,以便他们在更新中修复它? 当然,您可以从 intellij 网站发送支持电子邮件。 您是否联系过 JetBrains?距离 2022 年还有几个星期,这个错误仍然存在。这让我疯狂。以下答案是不可接受的 IMO。 您似乎从未接受过答案,您有没有发现任何有效的方法? @JΛY-ÐΞV 我不这么认为。我从不赞成任何答案。 【参考方案1】:找到解决此问题的方法是一项不错的任务。 IntelliJ 能够通过属性fx:controller="your.package.here.MyController"
跟踪引用。
定义的参数应该传递给控制器new MyController(...);
。
这是指定的任务。
那么,如何整合JavaFX and CDI?您可以在构造函数上添加@Inject
注释,而不是注释属性。
通过这种方式,您可以创建具有指定参数的控制器实例,并使用fx:controller
属性设置引用。
【讨论】:
是否有该解决方法的链接?你是什么意思“com.example”?是否应该被项目的包替换? 我的意思是“your.package.name.MyController”。您可以在这里找到可能的集成示例:dzone.com/articles/fxml-javafx-powered-cdi-jboss,在这里您可以找到构造函数注入的信息:baeldung.com/java-ee-cdi @JΛY-ÐΞV 我可以在我的环境中本地运行。因此,如果您需要帮助,请告诉我。 好吧,我不得不回到一个旧项目,编写一个用 C++ 编写并在本机 Node.js 模块中实现的 JSON 解析器,所以我至少有一个月没有使用 JFX/OpenFX ,也许是两个。不过,我必须回到外汇项目,因为我已经把它卖给了一个客户,也许你还会在?如果你是,我当然很想从你那里得到一些澄清。我想尝试使用 CDI 实施该项目。无论如何,与此同时,我必须用赏金做一些事情,所以它是你的。 感谢您抽出宝贵时间制作这些 cmets!【参考方案2】:即使,我也不喜欢那些通知。我以编程方式设置控制器。要禁用它,您需要将突出显示级别设置为无。 为此,请打开您的 fxml 文件,在右侧的最底部,您将看到一个赫克托图标。单击赫克托图标并通过拖动滑块将突出显示级别设置为无。
您需要重新启动 IDE 才能使更改生效。仅针对该文件将突出显示设置为无。在我们再次将它们的突出显示级别设置为无之前,其他文件的突出显示行为不会有任何变化。
如果您无法找到赫克托图标,请使用以下链接。 https://www.jetbrains.com/help/idea/status-bar.html
【讨论】:
什么是赫克托?除了一个已知的名字 ofc。【参考方案3】:您需要添加***元素 fx:controller。
假设您有一个基本的 fxml 文件,其中包含一个带有按钮的锚窗格,如下面的 fxml。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Button layoutX="102.0" layoutY="50.0" mnemonicParsing="false" text="Button" />
</children>
</AnchorPane>
在这种情况下,您的***元素将是锚窗格。如果您想使用像onMouseClicked
这样的操作按钮,您需要告诉 fxml 您在顶层元素(在本例中为锚窗格)中的控制器类,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.Controller">
<children>
<Button fx:id="buttonExample" layoutX="102.0" layoutY="50.0" mnemonicParsing="false" text="Button" />
</children>
</AnchorPane>
fx:controller="com.example.Controller"
行说我的控制类是 Controller,它位于 com.example 包中。
此外,您的元素 ID 应以 fx 开头,如示例 (fx:id="buttonExample"
) 中所示。
【讨论】:
如果您指定了该控制器,那么当您尝试访问控制器类中的文本字段、按钮时,您将获得空指针异常。 OP 说:“我没有在 FXML 中设置控制器,因为我有构造函数注入的数据,我想提供给控制器。”以上是关于以编程方式设置控制器时“没有为***元素指定控制器”的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图