[英]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.