我试图让一个简单的面板显示在一个网格中,它会对点击作出反应,但无论我做什么,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://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 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);
但无论我做什么,我在运行程序时都会遇到异常,告诉我无法找到点击事件的方法:
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放在私有字段上,所以问题不在于控制器类无法找到。此外,当我在最新的Scene Builder中加载FXML时,我可以在事件的下拉列表中选择此方法,因此Scene Builder似乎能够连接。
有人有想法吗?
答案 0 :(得分:1)
mouse click不是ActionEvent,而是MouseEvent,所以找不到handleOnMouseClicked方法,因为它的类型参数错误。
应该是:
@FXML
public void handleOnMouseClicked(MouseEvent event) {
. . .
}