【发布时间】:2015-09-30 14:27:27
【问题描述】:
所以我试图从 Swing 迁移到 JavaFX,我只是声明了 start() 和 launch() 方法,而不知道它们是如何工作的。但是下面的代码会在控制台上打印 false 和 false。但是,当我单击 GUI 中的按钮时,使用 Scene Builder 构建,执行 myMethod(),这次它打印为 true。为什么说primaryStage 没有实例化?
补充资料:
出于同样的原因,我还将这个类设为我的控制器 - 它需要访问舞台参考。我没有发布的完整版 Main 实现了 Initializable,如果这很重要的话。
作为附加问题我想知道我是否需要 primaryStage 的字段来引用 myMethod() 中的 Application Stage,这将只有一个?
public class Main extends Application {
private Stage primaryStage;
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
try {
Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Sample.fxml")),600,400);
primaryStage.setScene(scene);
} catch(Exception e) {
e.printStackTrace();
}
primaryStage.show();
//both lines below print false; As they should.
System.out.println(this.primaryStage == null);
myMethod();
}
public static void main(String[] args) {
launch(args);
}
public void myMethod() {
System.out.println(primaryStage == null);
}
}
编辑
将此 FXML 文档放在与上述类相同的文件夹中,您可以运行 Main 以查看该按钮确实打印为 true。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<HBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Main">
<children>
<Button mnemonicParsing="false" onAction="#myMethod" text="Button" />
</children>
</HBox>
【问题讨论】:
-
你能展示你如何在Button和MyMethod之间创建监听器关系吗?并请出示控制器。
-
你说Main实现Initializable?你为什么从这段代码中删除它?
-
@JamesWierzba 为了简单起见,我删除了似乎不必要的部分。该关系在 FXML 文档
onAction="#myMethod"中创建,并且该方法也正确执行。只是结果令人惊讶 -
您删除的代码很可能与问题有关。此外,用户可能希望重新创建您的问题以尝试调试它,如果您不显示代码,这是不可能的。
-
不要使用
Application子类作为控制器:它不会让任何事情变得更简单。launch()方法实例化Application子类并调用start(...)方法。如果您在fx:controller属性中指定相同的类,FXMLLoader将创建同一类的新实例,并将@FXML-annotated 字段注入到该实例。当您按下按钮时,将调用FXMLLoader创建的实例上的处理程序方法,而不是调用launch()创建的实例上的处理方法。
标签: java javafx scenebuilder