簡體   English   中英

JavaFX 如何將新的 FXML 內容注入當前場景

[英]JavaFX how to inject new FXML content to current Scene

我有一個應用程序,其中包含帶有標題和菜單的 HomeScene.fxml 文件。 HomeScene 也有dashboardPane,它應該在按下菜單按鈕后動態更改。 儀表板窗格內容應從另一個 fxml 文件加載,例如“FinancesPane.fxml”或“SettingsPane.fxml”。

我試圖替換 HomeController 中的dashboardPane 的內容:

@FXML
public void handleFinancesButtonAction() {
    FinancesPaneFactory paneFactory = new FinancesPaneFactory();
    dashBoardPane.getChildren().clear();
    dashBoardPane.getChildren().add(paneFactory.createPane());
}

我的 FinancesPaneFactory 看起來像這樣:

public class FinancesPaneFactory extends PaneFactory {

    private static final String PANE_TEMPLATE_PATH = "/sceneTemplates/FinancesPane.fxml";

    public FinancesPaneFactory() {
        super(PANE_TEMPLATE_PATH );
    }

    @Override
    protected Pane generatePane(FXMLLoader loader) {
        try {
            return (Pane) loader.load();
        } catch (IOException e) {
            throw new FatBirdRuntimeException("Unable to load FinancesPane", e);
        }
    }

}

更清楚地說,這是 HomeScene 的樣子: HomeScene 這個空白區域是一個dashboardPane,當用戶按下左邊的菜單按鈕時,應該用另一個內容替換。

如何動態注入此內容?

是的,您應該這樣做以保持場景圖較低,並且您將從更好的性能中受益,我所做的是創建動態容器:

@FXML
private ScrollPane dynamicNode;

滾動窗格是一個不錯的選擇。

這被放入 MainController。

我的主控制器與其他控制器不同,主控制器實際上是我唯一初始化的控制器,因此在您的主程序類中,無論您如何稱呼它:

private static MainViewController mainViewController;

...

 private static BorderPane loadMainPane() throws IOException {

        FXMLLoader loader = new FXMLLoader();
        loader.setController(mainViewController);
        BorderPane mainPane = (BorderPane) loader.load(
                CsgoRr.class
                .getResourceAsStream(Info.Resource.FXML_FILE_MAIN));
        mainPane.getStylesheets().add(CsgoRr.class.getResource("path...style.css").toString());

        return mainPane;
    }

不要忘記創建靜態訪問器,我擁有的其他控制器通常不會以這種方式創建,我在 fxml 中使用 fx:controller 來指定哪個控制器應該用於哪個 fxml ,通常可以方便地訪問 mainController 。

因此,要更改您的視圖,請在連接到您的菜單的主控制器方法中創建您更改視圖的視圖

@FXML
private void setViewPreferences() {
    setView(Info.Resource.FXML_FILE_PREFERENCES);
}

@FXML
private void setViewProductPage() {
    setView(Info.Resource.FXML_FILE_PRODUCT_PAGE);
}

當前在 dynamicNode 中是幫助查看當前選擇的到底是什么,它的

private String currentlyInDynamicPane;//not important

這是 setView

   public void setView(String fxmlPath) {
         dynamicNode.setContent(getView(fxmlPath));
            currentlyInDynamicPane = fxmlPath;
   }


  public Node getView(String fxmlPath) {
        try {
            return new FXMLLoader(getClass().getResource(fxmlPath)).load();
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
    }

因此,當您單擊左側菜單時,您會交換 FXML 文件,您可以確保在開始時或菜單中未選擇任何內容時顯示一些默認 FXML。

這就是我做的方式,粗略地。

因此,將您的儀表板視為 DynamicPane,

暫無
暫無

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

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