/ / Java: Jak uruchomić samodzielną aplikację z bieżącej, gdy obie są w tym samym pakiecie? - java, javafx-8, uruchamianie aplikacji

Java: Jak uruchomić samodzielną aplikację z bieżącej, gdy obie są w tym samym pakiecie? - java, javafx-8, uruchamianie aplikacji

Wydaje się, że powinno to być łatwe, więc muszę przegapić coś oczywistego: mam 4 samodzielne aplikacje w tym samym pakiecie, us.glenedwards.myPackage,

  • myClass1 rozszerza aplikację
  • myClass2 rozszerza aplikację

itp...

Potrzebuję każdej klasy, aby działała jako osobna aplikacja. Chcę jednak móc rozpocząć pozostałe 3 klasy od tej, w której jestem, klikając link. Android pozwala mi to zrobić za pomocą Intentów:

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

Próbowałem uruchomić myClass2 z myClass1 przy użyciu

myClass2.launch("");

Ale pojawia się błąd: „Uruchomienie aplikacji nie możezostać wywołanym więcej niż jeden raz. Jedynym sposobem, w jaki mogę go uruchomić, jest usunięcie zarówno „rozszerzenia aplikacji”, jak i metody start () z myClass2, co oznacza, że ​​myClass2 nie jest już samodzielną aplikacją.

Jak mogę uruchomić myClass2, myClass3 lub myClass4 z myClass1, przy czym wszystkie 4 są samodzielnymi aplikacjami?

Odpowiedzi:

4 dla odpowiedzi № 1

ty mogą zadzwoń, zadzwoń start(...) bezpośrednio w nowej instancji jednego z Application podklasy, ale wydaje się trochę hack i jest sprzeczne z przeznaczeniem start(...) metoda. (Tylko semantycznie: wywołana metoda start w klasie o nazwie Application powinien zostać wykonany podczas uruchamiania aplikacji, a nie w dowolnym dowolnym momencie po jej uruchomieniu.)

Naprawdę powinieneś pomyśleć o start metoda jako zamiennik main metoda w tradycyjnej aplikacji Java. Jeśli jedna aplikacja dzwoni do innej aplikacji main metoda (miejmy nadzieję) dojdzie do wniosku, że źle ustrukturyzowałeś rzeczy.

Polecam więc przefakturowanie projektu, aby poszczególne komponenty nie były podklasami aplikacji, ale zwykłymi starymi klasami:

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...
}

i podobnie

public class SecondModule {

private GridPane view ;

public SecondModule {

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

public Parent getView() {
return view ;
}
}

Teraz możesz po prostu robić takie rzeczy

FirstModule firstModule = new FirstModule();
Scene scene = new Scene(firstModule.getView());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();

gdziekolwiek musisz to zrobić. Możesz więc tworzyć samodzielne aplikacje dla każdego modułu:

public class FirstApplication extends Application {

@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new FirstModule().getView());
primaryStage.setScene(scene);
primaryStage.show();
}
}

lub możesz utworzyć ich instancję w ramach większej aplikacji:

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

i

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

Tak myślę o tym Application podklasy reprezentują cały biegpodanie. W związku z tym sensowne jest tworzenie instancji jednej takiej klasy tylko raz dla jednej maszyny JVM, dlatego należy uważać, że z natury nie można ich ponownie użyć. Przenieś gdzieś kod, który chcesz ponownie wykorzystać, do innej klasy.


0 dla odpowiedzi nr 2

próbowałeś tego?

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

W razie potrzeby obsłuż / wychwytuj wyjątki.


0 dla odpowiedzi № 3

Miałem rację; to było oczywiste. Właśnie to dostaję za pisanie kodu podczas 4 godzin snu:

myClass2 class2 = new myClass2();
try {
class2.start(stage);
} catch (Exception e) { e.printStackTrace(); } }