Cómo llamar a launch () más de una vez en java

Cómo llamar al lanzamiento () más de una vez en java me da una excepción como “ERROR IN MAIN: java.lang.IllegalStateException: el inicio de la aplicación no se debe llamar más de una vez”

He creado cleint de reposo en mi aplicación java cuando llega la solicitud, se llama javafx y se abre la vista web después de completar la operación webview y cierro las ventanas javafx usando el método Platform.exit (). cuando llega la segunda solicitud recibo este error sobre cómo solucionar este error.

Código de aplicación JavaFx:

public class AppWebview extends Application { public static Stage stage; @Override public void start(Stage _stage) throws Exception { stage = _stage; StackPane root = new StackPane(); WebView view = new WebView(); WebEngine engine = view.getEngine(); engine.load(PaymentServerRestAPI.BROWSER_URL); root.getChildren().add(view); engine.setJavaScriptEnabled(true); Scene scene = new Scene(root, 800, 600); stage.setScene(scene); engine.setOnResized(new EventHandler<WebEvent>() { public void handle(WebEvent ev) { Rectangle2D r = ev.getData(); stage.setWidth(r.getWidth()); stage.setHeight(r.getHeight()); } }); JSObject window = (JSObject) engine.executeScript("window"); window.setMember("app", new BrowserApp()); stage.show(); } public static void main(String[] args) { launch(args); } 

Método RestClient: Llamada a la aplicación JavaFX

 // method 1 to lanch javafx javafx.application.Application.launch(AppWebview.class); // method 2 to lanch javafx String[] arguments = new String[] {"123"}; AppWebview .main(arguments); 

No puede llamar a launch() en una aplicación JavaFX más de una vez, no está permitido.

Desde el javadoc:

 It must not be called more than once or an exception will be thrown. 

Sugerencia para mostrar una ventana periódicamente

  1. Simplemente llame a Application.launch() una vez.
  2. Mantenga el tiempo de ejecución de JavaFX ejecutándose en segundo plano usando Platform.setImplicitExit(false) , para que JavaFX no se cierre automáticamente cuando oculta la última ventana de la aplicación.
  3. La próxima vez que necesite otra ventana, ajuste la llamada de show() la ventana en Platform.runLater() , para que la llamada se ejecute en el subproceso de la aplicación JavaFX.

Si está mezclando Swing puede usar un JFXPanel en lugar de una Aplicación , pero el patrón de uso será similar al descrito anteriormente.

Muestra Wumpus

 import javafx.animation.PauseTransition; import javafx.application.*; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.stage.Stage; import javafx.util.Duration; import java.util.*; // hunt the Wumpus.... public class Wumpus extends Application { private static final Insets SAFETY_ZONE = new Insets(10); private Label cowerInFear = new Label(); private Stage mainStage; @Override public void start(final Stage stage) { // wumpus rulez mainStage = stage; mainStage.setAlwaysOnTop(true); // the wumpus doesn't leave when the last stage is hidden. Platform.setImplicitExit(false); // the savage Wumpus will attack // in the background when we least expect // (at regular intervals ;-). Timer timer = new Timer(); timer.schedule(new WumpusAttack(), 0, 5_000); // every time we cower in fear // from the last savage attack // the wumpus will hide two seconds later. cowerInFear.setPadding(SAFETY_ZONE); cowerInFear.textProperty().addListener((observable, oldValue, newValue) -> { PauseTransition pause = new PauseTransition( Duration.seconds(2) ); pause.setOnFinished(event -> stage.hide()); pause.play(); }); // when we just can't take it anymore, // a simple click will quiet the Wumpus, // but you have to be quick... cowerInFear.setOnMouseClicked(event -> { timer.cancel(); Platform.exit(); }); stage.setScene(new Scene(cowerInFear)); } // it's so scary... public class WumpusAttack extends TimerTask { private String[] attacks = { "hugs you", "reads you a bedtime story", "sings you a lullaby", "puts you to sleep" }; // the restaurant at the end of the universe. private Random random = new Random(42); @Override public void run() { // use runlater when we mess with the scene graph, // so we don't cross the streams, as that would be bad. Platform.runLater(() -> { cowerInFear.setText("The Wumpus " + nextAttack() + "!"); mainStage.sizeToScene(); mainStage.show(); }); } private String nextAttack() { return attacks[random.nextInt(attacks.length)]; } } public static void main(String[] args) { launch(args); } } 

prueba esto, probé esto y encontré con éxito

 @Override public void start() { super.start(); try { // Because we need to init the JavaFX toolkit - which usually Application.launch does // I'm not sure if this way of launching has any effect on anything new JFXPanel(); Platform.runLater(new Runnable() { @Override public void run() { // Your class that extends Application new ArtisanArmourerInterface().start(new Stage()); } }); } catch (Exception e) { e.printStackTrace(); } }