Можно ли запустить приложение JavaFX через другое приложение JavaFX? - PullRequest
0 голосов
/ 21 октября 2019

Могу ли я узнать, почему возникает ошибка, когда я говорю.

Stage s = new Stage();

new CaeserCipherFX().start(s);

Этомой код ниже. Мне нужно запустить еще одно JavaFX приложение из этого. Пожалуйста помоги. Спасибо.

public class Main extends Application
{

    String args[];
    @Override
    public void start(Stage stage) throws Exception
    {

        // creating types of encryptions (Button)

        Button caeserCipher = new Button("1. Caeser Cipher");
        Button runningKeyCipher = new Button("2. Running Key Cipher");
        Button trithemiusCipher = new Button("3. Trithemius Cipher");
        Button vignereCipher = new Button("4. Vignere Cipher");

        //setting styles
        caeserCipher.setTextFill(Color.BLUE);
        runningKeyCipher.setTextFill(Color.BLUE);
        trithemiusCipher.setTextFill(Color.BLUE);
        vignereCipher.setTextFill(Color.BLUE);

        /*need to add more!*/
        //setting action listeners
        String arr [] = {"CaeserCipher","RunningKeyCipher","TrithemiusCipher","VignereCipher"};
        caeserCipher.setOnAction((ActionEvent event)->{
                //open caeser cipher
                Stage s = new Stage();
                new CaeserCipherFX().start(s);

            });
        runningKeyCipher.setOnAction((ActionEvent event)->{
                //open running key cipher
                stage.hide();
            });
        trithemiusCipher.setOnAction((ActionEvent event)->{
                //open trithemius cipher 
                stage.hide();
            });
        vignereCipher.setOnAction((ActionEvent event)->{
                //open vignere cipher
                stage.hide();
            });
        // creating flowpane(FlowPane)
        FlowPane menu = new FlowPane();
        menu.setHgap(25);
        menu.setVgap(25);
        menu.setMargin(caeserCipher, new Insets(20, 0, 20, 20));

        //list for Flowpane(ObservableList)
        ObservableList list = menu.getChildren();

        //adding list to flowpane
        list.addAll(caeserCipher,runningKeyCipher,trithemiusCipher,vignereCipher);

        //scene for stage
        Scene scene = new Scene(menu);

        stage.setTitle("Main Menu");
        stage.setScene(scene);
        // stage.initStyle(StageStyle.UTILITY);
        stage.setHeight(100);
        stage.setWidth(600);
        stage.setResizable(false);

        // Show the Stage (window)
        stage.show();
    }

}

И я хочу запустить следующий код:

public class CaeserCipherFX extends Application
{

    @Override
    public void start(Stage stage) throws Exception
    {//some other code
        //some other code
    }
 }

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Существует вездесущий основной поток приложения 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.

0 голосов
/ 21 октября 2019

Можно ли запустить приложение JavaFX через другое приложение JavaFX? Не совсем.

В качестве альтернативы, вы можете использовать java.lang.ProcessBuilder

Этот класс по существу отправляет командные строки в оболочку вашей операционной системы.

Вы можете использовать его для запуска чего-либокак "java -jar XXX \ YYY \ CaeserCipherFX.jar" всякий раз, когда вы нажимаете кнопку. (вам придется встроить проект CaeserCypherFX в файл jar)

Это создаст новую JVM. Это означает отсутствие разделения памяти. Вы можете справиться с этим через IPC.

...