簡體   English   中英

如何使用spring依賴注入連接多個fxml控制器?

[英]How to wire multiple fxml controllers using spring dependency-injection?

我閱讀了一些基本示例的春季教程,我對如何正確連接事物感到困惑。

問題是,我想使用應用程序上下文來提取單例控制器引用,但我讀到了一些其他主題,除非絕對必要,否則不應直接訪問應用程序上下文。 我想我應該使用構造函數來實例化我想要的引用,但是這里的事情對我來說都很模糊。

我有幾個fxml文件的javafx應用程序。 我有一個主要的fxml和其他動態加載在main中。

我將使用簡化代碼,例如兩個fxml控制器, MainController.java (用於主fxml)和ContentController.java (用於內容fxml)

想法是內容fxml有TabPane,主fxml有按鈕,在ContentController上的TabPane中打開新選項卡。

我目前正在做這樣的事情

bean xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="contentController"
class="ContentController"
scope="singleton" />
</beans>

MainControler:

public class MainOverlayControler {

ApplicationContext context;

@FXML
private BorderPane borderPane;

@FXML
private void initialize() {
    loadContentHolder();
}
@FXML
private Button btn;

@FXML
private void btnOnAction(ActionEvent evt) {
    ((ContentController)context.getBean("contentController")).openNewContent();
}

private void loadContentHolder() {
    //set app context
    context = new ClassPathXmlApplicationContext("Beans.xml");

    Node fxmlNode;
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setController(context.getBean("contentController"));

    try {
    fxmlNode = (Node)fxmlLoader.load(getClass().getResource("Content.fxml").openStream());
    borderPane.setCenter(fxmlNode);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ContentController:

public class ContentController {
@FXML
private TabPane tabPane;

public void openNewContent() {
    Tab newContentTab = new Tab();
    newContentTab.setText("NewTab");
    tabPane.getTabs().add(newContentTab);
    }
}

主要課程:

public class MainFX extends Application {
@Override
public void start(Stage primaryStage) {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader();
        Parent root = (Parent) fxmlLoader.load(getClass().getResource("main.fxml").openStream());
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
    e.printStackTrace();
    }
public static void main(String[] args) {
    launch(args);
    }
}

問題:如果我誤解了這個概念,我想知道如何用構造函數DI做同樣的事情,或者其他一些方法。

我需要能夠從多個其他控制器上調用“ContentController”的單例實例上的“openNewContent”。

閱讀有關JavaFX和Spring集成的更多信息。 我推薦Stephen Chin的系列

基本上,您需要將JavaFX類嵌入到Spring上下文生命周期中,並且在鏈接文章中對它進行了很好的描述。

您還可以在GitHub上檢查他的示例項目,其中使用JavaFX 2.1中引入的控制器工廠簡化了代碼( 在此處查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM