提问者:小点点

JavaFX 12 maven和Spring


我正在尝试为我的pom添加Spring,但我想知道我的构建是否看起来像这样。有人可以帮我如何与java fx进行Spring集成吗?

我的pom:

    <properties>
        <java.version>12</java.version>
    </properties>

    <dependencies>
       <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>12.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>12.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

主要类:

public class App extends Application {
    private static Scene scene;
    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML("primary"));
        stage.setScene(scene);
        stage.show();
    }
    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }
    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
    }
    public static void main(String[] args) {
        launch();
    } }

我搜索了一下,没有找到任何关于将javafx与Spring集成的信息,有人能帮我如何集成Spring吗?

我试着用我在摇摆项目中使用的东西,但没有成功。


共1个答案

匿名用户

你的主app要像这样维护Spring的应用上下文。

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

@Configuration // or @SpringBootApplication if you used spring boot.
public class App extends Application {
    private static Scene scene;
    private AbstractApplicationContext context;

    @Override
    public void init() throws Exception {
        this.context = new AnnotationConfigApplicationContext(App.class);
        super.init();
    }

    @Override
    public void start(Stage stage) throws IOException {
        SpringFxmlLoader loader = new SpringFxmlLoader(this.context);
        Parent root = loader.loadFromResource("primary.fxml");
        stage.setScene(new Scene(root));
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

使用 SpringFxmlLoader 将控制器作为 Spring Bean 返回。

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.springframework.context.ApplicationContext;

import javafx.fxml.FXMLLoader;

public class SpringFxmlLoader extends FXMLLoader {
    private ApplicationContext context;

    protected SpringFxmlLoader() {
    }

    public SpringFxmlLoader(ApplicationContext context) {
        this.context = context;
        setControllerFactory(context::getBean);     // return a spring bean from spring's application context.
    }

    public ApplicationContext getContext() {
        return this.context;
    }

    public <T> T loadFromResource(String resource) throws IOException {
        return loadFromResource(resource, null);
    }

    public <T> T loadFromResource(String resource, Class<?> root) throws IOException {
        URL resourceURL = context.getResource(resource).getURL();
        setLocation(resourceURL);
        if(root != null) setRoot(root);
        try (InputStream fxml = resourceURL.openStream()) {
            return load(fxml);
        }
    }
}

您的控制器应该像这样看起来像一个Spring豆。

@Controller
@Scope("prototype")
public class PrimaryController {
    @FXML private Parent rootView;
    @FXML private TitledPane settingPane;

    @Autowired private SomeBean someBean;   // now you can autowire spring beans.
    // braa....

}

不要忘记在primary.fxml中使用fx:controller属性指定控制器类。