我正在尝试创建一个简单的按钮,但我收到这个愚蠢的错误,它没有任何意义。
这是我的管理员场景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
有人可以帮忙吗?
答案 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
属性。
当然你也可以简单地将字段/方法移动到顶级类......