【问题标题】:JavaFX: LoadException resolving onAction for event handler of a button [duplicate]JavaFX:LoadException为按钮的事件处理程序解析onAction [重复]
【发布时间】:2017-07-20 07:03:12
【问题描述】:

我是 JavaFX 的新手。尝试按照教程生成场景并将事件处理程序与按钮相关联。

我创建了一个 Main.FXML 并在 SceneBuilder 中进行了编辑。由于我在 IDE 中添加了 SceneBuilder 的路径,因此它能够检测到我的主控制器。我写了一个生成随机数的函数。

public class MainController {

    public static void generateRandom(ActionEvent event) {
        Random rand = new Random();
        int myrand = rand.nextInt(500) + 1;
        System.out.print(Integer.toString(myrand));
    }
}

在scenebuilder中,它会在控制器中检测到此方法,可以轻松地将其添加为按钮的OnAction的事件处理程序。 Main.FXML 在操作后更新。

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane prefHeight="300" prefWidth="500" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="application.MainController">
   <children>
      <Button layoutX="204.0" layoutY="204.0" mnemonicParsing="false" onAction="#generateRandom" text="Button" />
      <Label layoutX="138.0" layoutY="36.0" prefHeight="144.0" prefWidth="210.0" />
   </children>
</AnchorPane>

我的主要应用类如下:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("/application/Main.fxml"));
        Scene scene = new Scene(root,400,400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setTitle("My Title");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

当我运行应用程序时,出现错误:

javafx.fxml.LoadException: 解析 onAction='#generateRandom' 时出错, 事件处理程序不在命名空间中或有错误 在脚本中。 /C:/Users/Oscar/Workspace/Sunoco/bin/application/Main.fxml:10

Error resolving “onAction” while loading FXML 表示这可能与错误导入 ActionEvent 有关,但事实并非如此。此外,一切都是使用 SceneBuilder 和 Eclipse 自动设置的。那么为什么会出现这个错误呢?

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

    我认为如果您在 eventMethod 上使用@FXML 注释,问题将得到解决。此外,尽量不要在控制器中将方法设为静态,因为这可能会造成混淆/误导。如果您需要该方法可以从其他地方访问,请考虑在单独的(类似实用程序的)类中声明它。

    【讨论】:

    • 看起来static 引起了问题。在我把它拿出来之后,它在没有@FXML 注释的情况下工作。
    • 我使用了来自 SceneBuilder 的骨架构造函数代码。这具有“内部”函数,因此 .jfx 文件找不到这些函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多