/ / Java: Como inicio um aplicativo independente do atual, quando ambos estão no mesmo pacote? - java, javafx-8, inicialização de aplicativo

Java: Como inicio um aplicativo independente do atual, quando ambos estão no mesmo pacote? - java, javafx-8, inicialização de aplicativo

Parece que deve ser fácil, por isso devo estar perdendo algo óbvio: tenho 4 aplicativos independentes no mesmo pacote, us.glenedwards.myPackage,

  • myClass1 estende a aplicação
  • myClass2 estende a aplicação

etc ...

Eu preciso que cada classe atue como seu próprio aplicativo independente. No entanto, quero poder iniciar as outras 3 classes a partir da qual estou clicando em um link. O Android me permite fazer isso usando Intents:

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

Eu tentei iniciar o myClass2 a partir do myClass1 usando

myClass2.launch("");

Mas recebo um erro "O lançamento do aplicativo não deveser chamado mais de uma vez ". A única maneira de fazê-lo funcionar é removendo o método" extends application "e o método start () do myClass2, o que significa que o myClass2 não é mais um aplicativo independente.

Como posso iniciar myClass2, myClass3 ou myClass4 a partir de myClass1, com todos os quatro sendo aplicativos independentes?

Respostas:

4 para resposta № 1

Você posso faça esse trabalho chamando start(...) diretamente em uma nova instância de um dos Application subclasses, mas meio que parece um hack e é contrário ao uso pretendido do start(...) método. (Apenas semanticamente: um método chamado start em uma classe chamada Application deve ser executado quando o aplicativo for iniciado, não em algum momento arbitrário depois que ele já estiver em execução.)

Você realmente deveria pensar no start método como substituto para o main método em um aplicativo Java tradicional. Se você tivesse um aplicativo chamando outro aplicativo "s main (você espero) chegar à conclusão de que você estruturou as coisas incorretamente.

Portanto, eu recomendaria refatorar seu design para que seus componentes individuais não sejam subclasses de aplicativos, mas apenas classes regulares antigas:

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

e, da mesma forma,

public class SecondModule {

private GridPane view ;

public SecondModule {

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

public Parent getView() {
return view ;
}
}

Agora você pode simplesmente fazer coisas como

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

em qualquer lugar que você precisar. Portanto, você pode criar aplicativos independentes para cada módulo:

public class FirstApplication extends Application {

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

ou você pode instancia-los como parte de um aplicativo maior:

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

e

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

A maneira como penso nisso é que Application subclasses representam uma corrida inteirainscrição. Consequentemente, faz sentido instanciar uma dessas classes apenas uma vez por JVM, portanto, você deve considerá-las inerentemente não reutilizáveis. Mova qualquer código que você deseja reutilizar para uma classe diferente em algum lugar.


0 para resposta № 2

você já tentou isso?

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

Além disso, manipule / capture as exceções, conforme necessário.


0 para resposta № 3

Eu tinha razão; foi um acéfalo. É isso que recebo para escrever código em 4 horas de sono:

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