当前位置: 首页 > 知识库问答 >
问题:

获取“找不到控制器方法”没有可以理解的原因

司马飞
2023-03-14

我试图制作一个简单的面板,显示在一个网格中,它会在点击时做出反应,但无论我做什么,javafx似乎都无法将FXML连接到控制器类。

我有一个非常简单的FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="50.0" prefWidth="50.0" xmlns="http://html" target="_blank">javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="genmatfx.MaterialGridPanelController">
   <children>
      <BorderPane layoutX="-86.0" layoutY="-75.0" onMouseClicked="#handleOnMouseClicked" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <center>
            <ImageView fx:id="MatView" onMouseClicked="#handleOnMouseClicked" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER" />
         </center>
      </BorderPane>
   </children>
</AnchorPane>

在控制器类(MaterialGridPanelController.java)中,有一个简单的事件来捕捉鼠标点击:

@FXML
public void handleOnMouseClicked(ActionEvent event) {
    Parent.TriggerMaterialUsed(this, DisplayedMaterial);
}

经过一些研究,我发现使用FXMLLoader的静态加载程序方法存在问题,因此我已经使用了FXMLLoader的一个实例来创建如下面板:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("MaterialGridPanel.fxml"));
    AnchorPane pane = (AnchorPane) loader.load();
    MaterialGridPanelController controller = loader.<MaterialGridPanelController>getController();
    controller.SetMaterial(this, AvailiableMaterials.get(matName));
    GridPane.setHalignment(pane, HPos.CENTER);
    GridPane.setValignment(pane, VPos.CENTER);
    grid.add(pane, col, row);

但无论我做什么,运行程序时都会出现异常,告诉我无法找到click事件的方法:

Controller method "handleOnMouseClicked" not found.
file:/C:/.../dist/run309258243/GenMatFX.jar!/genmatfx/MaterialGridPanel.fxml:14
  at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:492)
  at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:589)
  at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2430)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2136)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)

控制器可以工作,我确实把ImageView放在了一个私有字段上,所以问题不是找不到控制器类。此外,当我在最新的场景生成器中加载FXML时,我可以在事件下拉列表中选择此方法,因此场景生成器似乎能够连接。

有人有主意吗?

共有1个答案

通寂离
2023-03-14

鼠标单击不是ActionEvent,而是MouseEvent,因此找不到handleOnMouseClicked方法,因为它的类型参数错误。

应该是:

@FXML
public void handleOnMouseClicked(MouseEvent event) {
    . . .
}
 类似资料:
  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 问题内容: 如标题所述,是否有一种简单的方法可以将两列输出到Java中的控制台? 我知道,但是在使用printf时,我还没有找到基于特定列进行空间分配的方法。 问题答案: 使用宽度和精度说明符,将其设置为相同的值。这将填充太短的字符串,并截断太长的字符串。“-”标志将使列中的值左对齐。

  • 本文向大家介绍Asp.net MVC中获取控制器的名称的方法,包括了Asp.net MVC中获取控制器的名称的方法的使用技巧和注意事项,需要的朋友参考一下 1、视图中   2、控制器的action中 3、过滤器中   比如在ActionFilterAttribute中,这个时候一般是自己实现一个继承类,然后重写相关的方法。   在重写的方法中如果需要控制器的名称。 4、公共方法中 以上所述是小编给

  • 你有没有办法把它自动化?还有更多的方法是这样构造的。我在这里什么也不会有。这样做有意义吗,就像我想象的那样?

  • 我使用SpringBoot 1.5.9并创建了: 我的简单控制器正在处理“/”并转发到index.html: 根据SpringBoot文档,应该呈现下的静态内容。如果创建文件夹并将我的放在那里,并在pom.xml中包含spring-boot-starter-thymeleaf依赖项,那么一切都很好。但是,我很困惑为什么src/main/resources/static/index.html的基本呈

  • 在我添加了一个Spring Security过滤器后,这就停止工作了。 部署应用程序时,映射按预期配置 提交GET请求。 请求参数是由ExtJS添加的,这不是一个问题,因为它在没有安全性的情况下工作。