控制器'AdminSceneController'没有事件槽'logout' - JavaFX错误

时间:2016-03-24 02:11:58

标签: java javafx

我正在尝试创建一个简单的按钮,但我收到这个愚蠢的错误,它没有任何意义。

这是我的管理员场景FXML:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="437.0" prefWidth="582.0" stylesheets="@application.css" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="appController.AdminSceneController">
   <children>
      <Separator layoutX="-14.0" layoutY="101.0" prefHeight="10.0" prefWidth="601.0" />
      <Label layoutX="14.0" layoutY="29.0" text="admin panel">
         <font>
            <Font name="Book Antiqua" size="28.0" />
         </font>
      </Label>
      <Button layoutX="174.0" layoutY="32.0" mnemonicParsing="false" style="-fx-background-radius: 100px;" text="+" textFill="#369033" />
      <Button fx:id="logoutButton" layoutX="14.0" layoutY="65.0" mnemonicParsing="false" onAction="#logout" prefHeight="3.0" prefWidth="81.0" styleClass="logout" stylesheets="@application.css" text="(logout)" textFill="#070707" />
      <Button layoutX="387.0" layoutY="392.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="158.0" text="Delete" />
      <ListView layoutX="223.0" layoutY="106.0" prefHeight="327.0" prefWidth="128.0" />
   </children>
</Pane>

这是我的AdminSceneController.java

package appController;

import appDesign.PhotoAlbum;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;

public class AdminSceneController {

    public class MainSceneController {

        @FXML
        Button logoutButton;

        @FXML
        public void logout(ActionEvent event) throws Exception {
            PhotoAlbum.primaryStage.show();
            ((Node)(event.getSource())).getScene().getWindow().hide();
        }

    }

}

我收到Eclipse的警告说:

The controller 'AdminSceneController' has no event slot 'logout'

当我运行程序时,我收到错误:

javafx.fxml.LoadException: Error resolving onAction='#logout', either the event handler is not in the Namespace or there is an error in the script.
/C:/Users/Peter/Documents/GitHub/PhotoAlbum40/bin/appDesign/AdminPanelScene.fxml:19

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

你的AdminSceneController没有logout方法,你的类MainSceneController会这样做。

删除行

public class MainSceneController {

和结束},它应该有用。

答案 1 :(得分:0)

您必须明白,内部类(MainSceneController)与封闭类(AdminSceneController)不是同一个类。通过在fxml中使用fx:controller="appController.AdminSceneController",可以创建AdminSceneController的实例。但是,此类不包含单个方法或字段。这会导致错误。

此外请注意,FXMLLoader不允许您创建非static内部类。 如果您希望FXMLLoader创建控制器实例,则必须使MainSceneController成为静态并使用fx:controller="appController.AdminSceneController$MainSceneController"

围绕这个的方法是指定controllerFactory或自己创建控制器实例:

FXMLLoader loader = new FXMLLoader(getClass().getResource(...));
AdminSceneController enclosingInstance = new AdminSceneController(); // or any other way to get your hands on a instance of the enclosing class

// specify controller instance used yourself
loader.setController(enclosingInstance.new MainSceneController());

...

loader.load()

这要求您从fxml中删除fx:controller属性。

当然你也可以简单地将字段/方法移动到顶级类......