/ / Java: Wie starte ich eine eigenständige Anwendung von der aktuellen, wenn sich beide im selben Paket befinden? - Java, Javafx-8, App-Start

Java: Wie starte ich eine eigenständige Anwendung von der aktuellen, wenn sich beide im selben Paket befinden? - Java, Javafx-8, App-Start

Dies scheint einfach zu sein, daher muss mir etwas Offensichtliches fehlen: Ich habe 4 eigenständige Anwendungen im selben Paket, us.glenedwards.myPackage,

  • myClass1 erweitert Application
  • myClass2 erweitert Application

etc...

Ich brauche jede Klasse als eigene eigenständige Anwendung. Ich möchte jedoch in der Lage sein, die anderen 3 Klassen von der Klasse zu starten, in der ich mich befinde, indem ich auf einen Link klicke. Android ermöglicht mir dies mit Absichten:

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

Ich habe versucht, myClass2 von myClass1 mit zu starten

myClass2.launch("");

Aber ich bekomme eine Fehlermeldung: "Anwendungsstart darf nichtmehr als einmal aufgerufen werden ". Die einzige Möglichkeit, es zum Laufen zu bringen, besteht darin, sowohl die" erweiterte Anwendung "als auch die start () -Methode aus myClass2 zu entfernen, was bedeutet, dass myClass2 keine eigenständige Anwendung mehr ist.

Wie kann ich myClass2, myClass3 oder myClass4 von myClass1 aus starten, wobei alle 4 eigenständige Anwendungen sind?

Antworten:

4 für die Antwort № 1

Sie kann Damit dies funktioniert, rufen Sie an start(...) direkt auf einer neuen Instanz eines der Application Unterklassen, aber es fühlt sich irgendwie wie ein Hack an und widerspricht der beabsichtigten Verwendung der start(...) Methode. (Nur semantisch: eine Methode namens start in einer Klasse namens Application sollte ausgeführt werden, wenn Ihre Anwendung gestartet wird, nicht an einem beliebigen Punkt, nachdem sie bereits ausgeführt wurde.)

Sie sollten wirklich an die denken start Methode als Ersatz für die main Methode in einer traditionellen Java-Anwendung. Wenn Sie eine Anwendung hatten, die eine andere Anwendung aufruft main Methode würden Sie (hoffentlich) zu dem Schluss kommen, dass Sie die Dinge falsch strukturiert hatten.

Daher würde ich empfehlen, Ihr Design so umzugestalten, dass Ihre einzelnen Komponenten keine Anwendungsunterklassen sind, sondern nur alte reguläre Klassen:

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

und ähnlich

public class SecondModule {

private GridPane view ;

public SecondModule {

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

public Parent getView() {
return view ;
}
}

Jetzt können Sie einfach Dinge wie tun

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

überall, wo Sie sie tun müssen. So können Sie für jedes Modul eigenständige Anwendungen erstellen:

public class FirstApplication extends Application {

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

oder Sie können sie als Teil einer größeren Anwendung instanziieren:

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

und

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

So denke ich darüber Application Unterklassen repräsentieren einen gesamten LaufAnwendung. Folglich ist es sinnvoll, eine solche Klasse nur einmal pro JVM zu instanziieren. Sie sollten diese daher von Natur aus als nicht wiederverwendbar betrachten. Verschieben Sie jeden Code, den Sie wiederverwenden möchten, in eine andere Klasse.


0 für die Antwort № 2

hast du das probiert

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

Behandeln / fangen Sie die Ausnahmen nach Bedarf.


0 für die Antwort № 3

Ich lag richtig; Es war ein Kinderspiel. Das bekomme ich, wenn ich 4 Stunden Schlaf schreibe:

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