这似乎应该很容易,所以我必须遗漏一些明显的东西:我在同一个包中有4个独立的应用程序,us.glenedwards.myPackage,
等...
我需要每个类都作为自己的独立应用程序。然而,我希望能够通过单击链接启动我所在的其他3个类。 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中删除“extends application”和start()方法,这意味着myClass2不再是一个独立的应用程序。
如何从myClass1启动myClass2,myClass3或myClass4,其中所有4个都是独立的应用程序?
答案 0 :(得分:4)
你可以通过直接在其中一个start(...)
子类的新实例上调用Application
来完成这项工作,但这有点像黑客,并且与start(...)
方法的预期用法相反。 (只是在语义上:在应用程序启动时,应该在名为start
的类中执行一个名为Application
的方法,而不是在它已经运行后的某个任意点。)
您应该将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一次实例化一个这样的类才有意义,所以你应该认为这些本身不是可重用的。将您想要重用的任何代码移动到某个不同的类中。
答案 1 :(得分:0)
Runtime.getRuntime().exec("myClass1 [args]"); //put all args as you used in command
此外,根据需要处理/捕获异常。
答案 2 :(得分:0)
我是对的;这是一个明智的选择。这就是我在4小时睡眠时编写代码所得到的:
myClass2 class2 = new myClass2();
try {
class2.start(stage);
} catch (Exception e) { e.printStackTrace(); } }