/ / Java: Comment démarrer une application autonome à partir de celle en cours lorsque les deux sont dans le même package? - java, javafx-8, démarrage de l'application

Java: Comment démarrer une application autonome à partir de celle en cours lorsque les deux sont dans le même package? - java, javafx-8, démarrage de l'application

Cela semble être facile, donc je dois manquer quelque chose d'évident: j'ai 4 applications autonomes dans le même package, us.glenedwards.myPackage,

  • myClass1 étend l'application
  • myClass2 étend l'application

etc...

J'ai besoin que chaque classe agisse comme sa propre application autonome. Pourtant, je veux pouvoir commencer les 3 autres classes de celle dans laquelle je suis en cliquant sur un lien. Android me permet de le faire en utilisant Intents:

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

"J'ai essayé de démarrer myClass2 à partir de myClass1 en utilisant

myClass2.launch("");

Mais je reçois une erreur, "Le lancement de l'application ne doit pasêtre appelé plus d'une fois ". La seule façon de le faire fonctionner est de supprimer à la fois" étend l'application "et la méthode start () de myClass2, ce qui signifie que myClass2 n'est plus une application autonome.

Comment puis-je démarrer myClass2, myClass3 ou myClass4 à partir de myClass1 avec les 4 applications autonomes?

Réponses:

4 pour la réponse № 1

Toi pouvez faire ce travail en appelant start(...) directement sur une nouvelle instance de l'un des Application sous-classes, mais il se sent un peu comme un hack, et est contraire à l'utilisation prévue de la start(...) méthode. (Juste sémantiquement: une méthode appelée start dans une classe appelée Application doit être exécuté au démarrage de votre application, pas à un moment quelconque après son exécution.)

Vous devriez vraiment penser à la start méthode en remplacement de la main dans une application Java traditionnelle. Si vous aviez une application appelant une autre application main méthode, vous arriveriez (espérons-le) à la conclusion que vous aviez mal structuré les choses.

Je recommanderais donc de refactoriser votre conception afin que vos composants individuels ne soient pas des sous-classes d'application, mais simplement de vieilles classes régulières:

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

et, de même,

public class SecondModule {

private GridPane view ;

public SecondModule {

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

public Parent getView() {
return view ;
}
}

Maintenant, vous pouvez simplement faire des choses comme

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

partout où vous devez les faire. Vous pouvez donc créer des applications autonomes pour chaque module:

public class FirstApplication extends Application {

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

ou vous pouvez les instancier dans le cadre d'une plus grande application:

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

et

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

La façon dont je pense à cela est que Application les sous-classes représentent une course entièreapplication. Par conséquent, il est logique de n'instancier qu'une seule classe de ce type une fois par machine virtuelle Java, vous devez donc considérer que celles-ci ne sont pas intrinsèquement réutilisables. Déplacez n'importe quel code que vous souhaitez réutiliser dans une autre classe quelque part.


0 pour la réponse № 2

avez-vous essayé cela?

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

Gérez / interceptez également les exceptions, si nécessaire.


0 pour la réponse № 3

J'avais raison; c'était une évidence. C'est ce que j'obtiens en écrivant du code sur 4 heures de sommeil:

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