Spring Boot Main e JavaFX [fechado]
Eu tenho o aplicativo Java que altera um tabuleiro de jogo (2D). Agora eu quero ter uma GUI JavaFx para visualizar o quadro.
A Principal:
package example;
import example.common.MyService;
import example.gui.GUI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan({"example"})
public class Main ,implements CommandLineRunner {
@Autowired
MyService myService;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
GUI.launchApp(GUI.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("gameloop or something");
System.out.println(myService.getSomething());
}
}
AbstractJavaFxApplicationSupport:
package example.gui;
import javafx.application.Application;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component
public abstract class AbstractJavaFxApplicationSupport extends Application {
private static String[] savedArgs;
static ConfigurableApplicationContext applicationContext;
@Override
public void init() throws Exception {
super.init();
applicationContext = SpringApplication.run(getClass(), savedArgs);
applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
}
@Override
public void stop() throws Exception {
super.stop();
applicationContext.close();
}
public static void launchApp(Class<? extends AbstractJavaFxApplicationSupport> appClass, String[] args) {
AbstractJavaFxApplicationSupport.savedArgs = args;
Application.launch(appClass, args);
}
}
GUI:
package example.gui;
import example.common.MyService;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class GUI extends AbstractJavaFxApplicationSupport {
@Autowired
private MyService myService;
@Override
public void start(Stage primaryStage) throws Exception {
if (null == myService) {
throw new IllegalStateException("Service was not injected properly");
}
primaryStage.setTitle("Spring with JavaFX");
StackPane root = new StackPane();
root.getChildren().add(new Label("Hello World with " + myService.getSomething()));
Scene scene = new Scene(root);
scene.setFill(Color.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
}
}
MyService:
package example.common;
import org.springframework.stereotype.Component;
@Component
public class MyService {
public int getSomething() {
return 42;
}
}
A maioria das integrações de inicialização por mola do JavaFx são como as mostradas acima: Elas prescrevem a GUI como ponto de entrada para o aplicativo. Se eu executar este exemplo, dois aplicativos individuais serão inicializados (obviamente. Porque existem duas chamadas SpringApplication.run). Se você quer uma GUI autônoma, tudo bem, mas, para meu caso, não é.
O que eu realmente quero é uma bota e que eles compartilhem o mesmo contexto. Como arquivar isso? Ficaria grato se alguém pudesse me levar na direção certa.