Поэтому я пытаюсь перейти от Swing к JavaFX и просто объявляю методы start()
и launch()
, не зная, как они работают. Но ниже код выводит false и false на консоль. Однако, когда я нажимаю кнопку в графическом интерфейсе, созданном с помощью Scene Builder
, который выполняет myMethod()
, на этот раз он печатает true. Почему он говорит, что primaryStage
не создан?
дополнительная информация: я также сделал этот класс своим контроллером по той же причине — ему нужен доступ к ссылке на сцену. Полная версия Main, которую я не публиковал, реализует Initializable
, если это имеет значение.
В качестве дополнительного вопроса мне интересно, нужно ли мне поле primaryStage
для ссылки на этап приложения, который будет только один из?, в myMethod()
.
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>
onAction="#myMethod"
, и метод также выполняется правильно. Просто результат удивляет - person user2651804   schedule 30.09.2015Application
в качестве контроллера: это не сделает ничего проще. Методlaunch()
создает экземпляр подклассаApplication
и вызывает методstart(...)
. Если вы укажете тот же класс в атрибутеfx:controller
,FXMLLoader
создаст новый экземпляр того же класса и вставит поля с аннотациями@FXML
в этот экземпляр. Когда вы нажимаете кнопку, будет вызван метод обработчика экземпляра, созданногоFXMLLoader
, а не экземпляра, созданного вызовомlaunch()
. - person James_D   schedule 30.09.2015