2016-03-24 3 views
0

Ich versuche, eine einfache Schaltfläche zu erstellen, aber ich bekomme diesen dummen Fehler und es ergibt keinen Sinn.Der Controller 'AdminSceneController' hat keinen Event-Slot 'Logout' - JavaFX Error

Hier ist mein Admin-Szene 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> 

Und das ist mein 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(); 
     } 

    } 

} 

ich eine Warnung von Eclipse sagen:

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

Und wenn ich Führen Sie das Programm, ich bekomme den Fehler:

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 

Kann jemand helfen?

Antwort

1

Ihr AdminSceneController hat keine Abmelde-Methode, Ihre Klasse MainSceneController tut dies jedoch.

Entfernen Sie die Zeile

public class MainSceneController { 

und die Schließung } und es sollte funktionieren.

+0

Ich wusste, dass es ein dummer Grund dafür war. Ich weiß nicht, warum AdminScene darin verschachtelt wurde. Danke, dass du das für mich gefunden hast! – Laugh7

0

Sie müssen verstehen, dass eine innere Klasse (MainSceneController) nicht dieselbe Klasse wie die umschließende Klasse () ist. Unter Verwendung von fx:controller="appController.AdminSceneController" in der fxml wird eine Instanz von AdminSceneController erstellt. Diese Klasse enthält jedoch keine einzelne Methode oder Feld. Dies verursacht den Fehler.

Beachten Sie außerdem, dass die FXMLLoader es Ihnen nicht erlaubt, nicht static innere Klassen zu erstellen. Wenn die FXMLLoader Ihre Controller-Instanz erstellen möchten, müssen Sie MainSceneController statisch machen und fx:controller="appController.AdminSceneController$MainSceneController" verwenden.

Wege, dieses würde sich eine controllerFactory oder Erstellen der Controller-Instanz werden die Angabe:

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() 

dem Sie das fx:controller Attribut aus dem fxml entfernen erfordert.

Natürlich können Sie auch einfach das Feld/Methode auf eine Top-Level-Klasse bewegen ...

+0

Die AdminScene sollte nicht da sein. Ich weiß nicht, wie es passiert ist, haha. – Laugh7

Verwandte Themen