Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单击按钮时Java FXML调用方法_Java_Javafx_Fxml - Fatal编程技术网

单击按钮时Java FXML调用方法

单击按钮时Java FXML调用方法,java,javafx,fxml,Java,Javafx,Fxml,我正在使用SceneBuilder在JavaFX中创建一个基本的游戏启动器。因为SceneBuilder在FXML中工作,所以我的启动程序布局在FXML中。我在我的主类中有一个方法,我想在单击按钮时调用它。我读到你可以用 #methodName 在按钮的 onAction 属性,但这不起作用 我的主要Java类: @FXML private void launchGame(ActionEvent e) { System.out.println("Launching..."); }

我正在使用SceneBuilder在JavaFX中创建一个基本的游戏启动器。因为SceneBuilder在FXML中工作,所以我的启动程序布局在FXML中。我在我的主类中有一个方法,我想在单击按钮时调用它。我读到你可以用

#methodName
在按钮的

onAction
属性,但这不起作用

我的主要Java类:

@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();
}
我的FXML文件:

<?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>

您需要创建一个单独的控制器类,并使用
fx:Controller=“packageName.Classname”

像这样:

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

被调用的方法应位于指定的控制器类内


com.packageName
只是一个例子,您应该使用放置控制器类的包的名称,或者如果它不在任何包中,则不使用包的名称。

您需要创建一个单独的控制器类,并使用
fx:Controller=“packageName.Classname”在top
ancorpane
标记中指定它

像这样:

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

被调用的方法应位于指定的控制器类内


com.packageName
只是一个例子,您应该使用放置控制器类的包的名称,或者如果它不在任何包中,则不使用包名称。

您不应该直接编辑FXML文件。SceneBuilder允许您指定控制器、组件ID和操作。您是否通过SceneBuilder指定了操作?不,我没有,我在EclipseSorry中写道,我误读了您的评论。当然应该使用SceneBuilder。在使用SceneBuilder时,几乎不必直接编辑FXML文件。添加
fx:id
s和事件处理程序并指定控制器类后,SceneBuilder还可以为控制器生成框架代码。转到菜单上的“查看”并选择“显示骨架控制器代码”。然后,您可以将控制器代码复制并粘贴到IDE中(控制器必须在IDE中编辑,而不是在SceneBuilder中编辑)。您不需要直接编辑FXML文件。SceneBuilder允许您指定控制器、组件ID和操作。您是否通过SceneBuilder指定了操作?不,我没有,我在EclipseSorry中写道,我误读了您的评论。当然应该使用SceneBuilder。在使用SceneBuilder时,几乎不必直接编辑FXML文件。添加
fx:id
s和事件处理程序并指定控制器类后,SceneBuilder还可以为控制器生成框架代码。转到菜单上的“查看”并选择“显示骨架控制器代码”。然后可以将控制器代码复制并粘贴到IDE中(控制器必须在IDE中编辑,而不是在SceneBuilder中编辑)。