Получение "Метод контроллера не найден". без объяснения причин

Я пытаюсь сделать простую панель для отображения в сетке, которая реагирует на щелчок, но независимо от того, что я делаю, 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);

Но что бы я ни делал, я получаю исключение при запуске программы, говоря, что метод для события 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 в новейший Scene Builder, я могу выбрать этот метод в раскрывающемся списке событий, так что Scene Builder, кажется, может подключиться.

У кого-нибудь есть идея?

1 ответ

Решение

Щелчок мыши - это не ActionEvent, это MouseEvent, поэтому ваш метод handleOnMouseClicked не найден, поскольку он имеет неверный параметр типа.

Так должно быть:

@FXML
public void handleOnMouseClicked(MouseEvent event) {
    . . .
}
Другие вопросы по тегам