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

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

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

等等…

我需要每个班级作为自己的独立应用程序。 但是我希望能够通过点击一个链接来启动其他三个课程。 Android允许我使用Intents来做到这一点:

Intent intent = new Intent(this, EditData.class); overridePendingTransition(R.layout.edit_data_scrollview, R.layout.state); startActivity(intent); 

我试着从myClass1开始使用myClass2

myClass2.launch("");

但我得到一个错误,“应用程序启动不能被称为不止一次”。 唯一的办法,我可以得到它的工作是,如果我从myClass2删除“扩展应用程序”和start()方法,这意味着myClass2不再是一个独立的应用程序。

我怎样才能从myClass1开始myClass2,myClass3或myClass4,其中所有4个是独立的应用程序?

可以通过直接在一个Application子类的新实例上调用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 ; } } 

 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(); } } 

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

你有尝试过吗?

 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(); } } 
Interesting Posts