Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:当两个应用程序都在同一个包中时,如何从当前应用程序启动独立应用程序?_Java_Javafx 8_App Startup - Fatal编程技术网

Java:当两个应用程序都在同一个包中时,如何从当前应用程序启动独立应用程序?

Java:当两个应用程序都在同一个包中时,如何从当前应用程序启动独立应用程序?,java,javafx-8,app-startup,Java,Javafx 8,App Startup,这看起来应该很容易,所以我肯定错过了一些明显的东西:我在同一个包中有4个独立的应用程序,us.glenedwards.myPackage myClass1扩展了应用程序 myClass2扩展了应用程序 等等 我需要每个类充当自己的独立应用程序。然而,我想通过点击一个链接,从我所在的课程开始其他3个课程。Android允许我使用以下意图: Intent intent = new Intent(this, EditData.class); overridePendingTransition(R.

这看起来应该很容易,所以我肯定错过了一些明显的东西:我在同一个包中有4个独立的应用程序,us.glenedwards.myPackage

  • myClass1扩展了应用程序
  • myClass2扩展了应用程序
等等

我需要每个类充当自己的独立应用程序。然而,我想通过点击一个链接,从我所在的课程开始其他3个课程。Android允许我使用以下意图:

Intent intent = new Intent(this, EditData.class);
overridePendingTransition(R.layout.edit_data_scrollview, R.layout.state);
startActivity(intent);
我已经尝试使用

myClass2.launch(“”)

但我得到一个错误,“应用程序启动不能被调用多次”。我能让它工作的唯一方法是从myClass2中删除“extends application”和start()方法,这意味着myClass2不再是一个独立的应用程序

如何从myClass1启动myClass2、myClass3或myClass4,而这4个都是独立的应用程序?

您尝试过这个吗

Runtime.getRuntime().exec("myClass1 [args]"); //put all args as you used in command

另外,根据需要处理/捕获异常。

我是对的;这是一件不需要动脑筋的事。这就是我在4小时的睡眠中编写代码所得到的:

myClass2 class2 = new myClass2(); 
try { 
 class2.start(stage); 
} catch (Exception e) { e.printStackTrace(); } }
您可以通过直接在一个
应用程序
子类的新实例上调用
start(…)
来实现这一点,但这感觉有点像黑客,与
start(…)
方法的预期用途相反。(仅在语义上:在名为
Application
的类中,名为
start
的方法应该在应用程序启动时执行,而不是在应用程序已经运行后的任意点执行。)

您应该真正地将
start
方法看作是传统Java应用程序中
main
方法的替代方法。如果您让一个应用程序调用另一个应用程序的
main
方法,您(希望)会得出这样的结论:您的结构不正确

因此,我建议重构您的设计,使您的单个组件不是应用程序子类,而是普通的常规类:

public class FirstModule {

    // can be any Parent subclass:
    private BorderPane view ;

    public FirstModule() {

        // create view; you could also just load some FXML if you use FXML
        view = new BorderPane();

        // configure view, populate with controls, etc...

    }

    public Parent getView() {
        return view ;
    }

    // other methods as needed...
}
同样地

public class SecondModule {

    private GridPane view ;

    public SecondModule {

        view = new GridPane();
        // etc etc
    }

    public Parent getView() {
        return view ;
    }
}
现在你可以做一些事情,比如

FirstModule firstModule = new FirstModule();
Scene scene = new Scene(firstModule.getView());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
任何你需要的地方。因此,您可以为每个模块创建独立的应用程序:

public class FirstApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new FirstModule().getView());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
或者,您可以将它们实例化为更大应用程序的一部分:

public class CompositeModule {

    private HBox view ;

    public CompositeModule() {

        Button first = new Button("First Module");
        first.setOnAction(e -> {
            Parent view = new FirstModule().getView();
            Scene scene = new Scene(view);
            Stage stage = new Stage();
            stage.initOwner(first.getScene().getWindow());
            stage.setScene(scene);
            stage.show();
        });

        Button second = new Button("Second Module");
        second.setOnAction(e -> {
            Parent view = new SecondModule().getView();
            Scene scene = new Scene(view);
            Stage stage = new Stage();
            stage.initOwner(second.getScene().getWindow());
            stage.setScene(scene);
            stage.show();
        });

        HBox view = new HBox(10, first, second);
        view.setAlignment(Pos.CENTER);

    }

    public Parent getView() {
        return view ;
    }
}


我认为,
Application
子类代表整个正在运行的应用程序。因此,只对每个JVM一次这样的类实例化是有意义的,所以您应该考虑这些本质上是不可重用的。将您想要重用的代码移到其他类中。

:)这也回答了我的另一个问题-如何启动外部程序/应用程序并捕获结果。谢谢这是经过深思熟虑和精心组织的。我可以从一个主类中完成所有需要做的事情,但它正在变成一个10000多行的文件。由于4或5个主要组件(类)中的每一个都可以独立使用,而无需访问其他任何组件,因此我决定尝试将其编写为4或5个独立的应用程序,可以从一个父类随意访问,希望每个文件的行数不超过2500行。我在开发方面已经足够早了,我可以根据你的模板重写它。谢谢
public class CompositeApplication extends Application {
    @Override
    public void start(Stage primaryStage) {

        Scene scene = new Scene(new CompositeModule().getView(), 360, 150);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}