2017-09-14 2 views
0

Ich erstelle einen grundlegenden Spiel-Launcher in JavaFX mit SceneBuilder. Da SceneBuilder in FXML funktioniert, ist mein Launcher-Layout in FXML. Ich habe eine Methode in meiner Hauptklasse, die ich per Knopfdruck aufrufen möchte. Ich habe gelesen, dass SieJava FXML-Aufrufmethoden auf Knopfklicks

#methodName 

In der Schaltfläche

onAction 

Eigenschaft verwenden könnte, aber das funktioniert nicht.

Mein Haupt Java-Klasse:

@FXML 
private void launchGame(ActionEvent e) { 
    System.out.println("Launching..."); 
} 

@Override 
public void start(Stage primaryStage) throws IOException { 
    Parent root = FXMLLoader.load(Main.class.getResource("launcher.fxml")); 
    Scene scene = new Scene(root); 
    primaryStage.setScene(scene); 

    primaryStage.setTitle("First Week Login"); 
    primaryStage.setResizable(false); 
    primaryStage.sizeToScene(); 

    primaryStage.show(); 
} 

Meine FXML Datei:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.text.Text?> 
<?import javafx.scene.web.WebView?> 


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" 
xmlns="http://javafx.com/javafx/8.0.102"> 
<children> 
    <BorderPane prefHeight="493.0" prefWidth="664.0" styleClass="background" 
stylesheets="@launcher.css"> 
    <bottom> 
     <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" 
BorderPane.alignment="CENTER"> 
      <children> 
       <Button alignment="CENTER" mnemonicParsing="false" 
text="Launch Game" onAction="#launchGame" /> 
      </children> 
     </HBox> 
    </bottom> 
    <top> 
     <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" 
BorderPane.alignment="CENTER"> 
      <children> 
       <Text strokeType="OUTSIDE" strokeWidth="0.0" 
styleClass="title" text="First Week" /> 
      </children> 
     </HBox> 
    </top> 
    <center> 
     <WebView prefHeight="200.0" prefWidth="200.0" 
BorderPane.alignment="CENTER" /> 
    </center> 
    </BorderPane> 
</children> 
</AnchorPane> 
+0

Sie sollten die FXML-Datei nicht direkt bearbeiten müssen. In SceneBuilder können Sie einen Controller, Komponenten-IDs und Aktionen angeben. Hast du die Aktion über SceneBuilder festgelegt? –

+0

Nein, ich habe nicht, schrieb ich in Eclipse – JPadley

+0

Sorry, ich habe Ihren Kommentar falsch gelesen. Sollte definitiv SceneBuilder dafür verwenden. Sie sollten die FXML-Datei fast nie direkt bearbeiten müssen, wenn Sie SceneBuilder verwenden. –

Antwort

3

Sie benötigen eine separate Controller-Klasse erstellen und sie in Top-AnchorPane Tag mit fx:controller="packageName.Classname"

Wie dies angeben :

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" 
xmlns="http://javafx.com/javafx/8.0.102" 
fx:controller="com.packageName.Controller"> 

Die aufgerufene Methode sollte innerhalb der angegebenen Controller-Klasse liegen.

com.packageName ist nur ein Beispiel, Sie sollten den Namen des Pakets verwenden, wo Sie die Controller-Klasse oder keinen Paketnamen, wenn es nicht in einem Paket ist.

+0

Funktioniert perfekt, danke! – JPadley