Существует вездесущий основной поток приложения JavaFX, к которому нужно некоторое время, чтобы привыкнуть.
Думайте об этом как о внешнем потоке. Теоретически, вы должны использовать этот поток для обработки обновлений пользовательского интерфейса и сложных задач процессора, таких как поиск чего-либо в BD или вычисление 100-тысячного десятичного числа PI должны быть выполнены в фоновом потоке. Если вы этого не сделаете, пользовательский интерфейс перестанет отвечать на запросы до тех пор, пока не будут возвращены данные БД, или пока не будет найден этот десятичный знак.
public class TestClass extends Application {
public static void main(String[] args) {
System.out.println("here");
Application.launch(TestClass.class, args);
System.out.println("this is called once application launch is terminated.");
}
@Override
public void init() throws Exception {
super.init(); //To change body of generated methods, choose Tools | Templates.
System.out.println("message from init");
}
@Override
public void start(Stage primaryStage) throws Exception { // this is abstract.
System.out.println("message from start");
Platform.exit(); // if you remove this line, the application won't exit.
}
}
Поскольку JavaFX поставляется с некоторыми предварительными условиями, вам нужно запустить процесс rapplication с использованиемвнешний интерфейс. Вы можете обойти это, но технически,
public void start(Stage primaryStage)
- это то, что для всех интенсивных целей запускает вашу программу.
Здесь вы можете использовать primaryStage для управления большей частью вашего приложения. ,Хорошей идеей будет поместить в него .onCloseRequest (), в котором вы вызываете Platform.exit ();
Если вы хотите иметь несколько окон в своем приложении, вы можете использовать что-то вроде
public class TestClass extends Application {
public static void main(String[] args) {
System.out.println("here");
Application.launch(TestClass.class, args);
System.out.println("this is called once application launch is terminated.");
}
@Override
public void init() throws Exception {
super.init(); //To change body of generated methods, choose Tools | Templates.
System.out.println("message from init");
}
@Override
public void start(Stage primaryStage) throws Exception { // this is abstract.
primaryStage.setScene(new Scene(new TextArea("this is the first stage (window)")));
primaryStage.setTitle("stage 1");
primaryStage.show();
primaryStage.setOnCloseRequest((event) -> {
Platform.exit();
});
Stage secondaryStage = new Stage();
secondaryStage.setTitle("stage 2");
TextArea ta2 = new TextArea("this is a different stage.");
Scene scene = new Scene(ta2);
secondaryStage.setScene(scene);
secondaryStage.show();
primaryStage.setX(200);
secondaryStage.setX(200 + primaryStage.getWidth() + 50);
}
}
Это то, что я предполагаю, что вы хотите сделать. В основном создайте новое окно всякий раз, когда вы нажимаете кнопку. Вы можете создавать этапы, подобные этой.
Причина, по которой вы не можете сделать это по-своему, заключается в том, что вы пытаетесь запустить другой поток javafx, вызывая новый CaeserCipherFX, который является объектом приложения, а не Stage.
new CaeserCipherFX().start(s); // this can only be called once.
Если вы абсолютно хотите иметь 2 разных приложения (примечание: не окна приложений), тогда вам нужно иметь 2 разных процесса.
Наконец, параметр primaryStage, используемый в обоих примерах,в начале, в основном, это местозаполнитель (как он построен, но на самом деле в нем нет ничего ... как новая String ()). Вы можете использовать различные объекты сцены в качестве «основного» пользовательского интерфейса.
Наконец, если в зависимости от материала, который вы хотите расшифровать, вам может понадобиться использовать фоновые потоки, если вы хотите сохранить отзывчивость пользовательского интерфейса. Для этого вам нужно проверить часть параллелизма в руководстве по javafx.