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
Application.launch()
una vez. Platform.setImplicitExit(false)
, para que JavaFX no se cierre automáticamente cuando oculta la última ventana de la aplicación. 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(); } }