gpt4 book ai didi

java - Spring Boot Main 和 JavaFX

转载 作者:行者123 更新时间:2023-11-30 06:21:27 27 4
gpt4 key购买 nike

我有一个可以改变游戏板(2D)的Java应用程序。现在我想要一个 JavaFx GUI 来可视化板。

主要:

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

}

抽象JavaFxApplicationSupport:

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

}

图形用户界面:

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

我的服务:

package example.common;

import org.springframework.stereotype.Component;

@Component
public class MyService {
public int getSomething() {
return 42;
}
}

大多数 JavaFx spring boot 集成如上所示:它们规定 GUI 作为应用程序的入口点。如果我运行这个示例,则会启动两个单独的应用程序(显然。因为有两个 SpringApplication.run 调用)。如果您想要一个独立的 GUI,这很好,但对于我的用例来说则不然。

我真正想要的是一只 Boot ,并且它们共享相同的上下文。如何存档这个?如果有人能引导我走向正确的方向,我将不胜感激。

最佳答案

您需要对 AbstractJavaFxApplicationSupport 进行以下修复:

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 {

static ConfigurableApplicationContext applicationContext;

@Override
public void init() throws Exception {
super.init();
applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
}

@Override
public void stop() throws Exception {
super.stop();
applicationContext.close();
}

public static void launchApp(Class<? extends AbstractJavaFxApplicationSupport> appClass, ConfigurableApplicationContext context, String[] args) {
applicationContext = context;
Application.launch(appClass, args);
}

}

所以,对于你的例子来说这就足够了。您只需传递之前创建的上下文即可。

但首先,我认为您不需要将应用程序作为上下文的组件 - 我不知道如何使用它。其次,我认为您将在 UI 中使用 fxml,为此您可以使用 FxmlLoader。该加载器有术语Controller,这意味着该Controller将初始化此类中的所有组件(就JavaFx而言)。因此,对于此 Controllers 的依赖项注入(inject),您可以使用方法 FxmlLoader.setControllerFactory(context::getBean);。但它仅适用于此 Controller ,不适用于某些 View 或面板

关于java - Spring Boot Main 和 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48079005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com