Java:当两个应用程序都在同一个包中时,如何从当前应用程序启动独立应用程序?
这看起来应该很容易,所以我肯定错过了一些明显的东西:我在同一个包中有4个独立的应用程序,us.glenedwards.myPackageJava:当两个应用程序都在同一个包中时,如何从当前应用程序启动独立应用程序?,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.
- myClass1扩展了应用程序
- myClass2扩展了应用程序
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();
}
}