簡體   English   中英

如何在JavaFX中關閉子窗口后刷新父窗口?

[英]How to refresh parent window after closing child window in JavaFX?

我有一個顯示人物的父窗口,即:

FirsName:約翰

名字:布朗

年齡:18

我單擊編輯按鈕,子窗口打開,更改名字然后單擊接受,子窗口關閉,更改在mysql數據庫中保存,但父窗口仍顯示舊值。 我有一個有效的刷新方法,但是如何從子窗口調用它或將其設置為在關閉子窗口后調用?

父窗口和子窗口都有控制器和fxml。 任何幫助,將不勝感激。

James_D的答案(更好)

感謝@James_D ,您應該使用setOnHidden而不是setOnCloseRequest ,這樣您就可以再次調用.close()並調用EventHandler


我的答案

你可以使用setOnCloseRequest

childStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {
        // Refresh the parent window here
    }
});

要在子表單上調用此關閉請求,您可以執行以下操作:

    childStage.getOnCloseRequest().handle(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
    // or
    childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));

所以你可以在子階段上實現關閉按鈕,如下所示:

Button closeButton = new Button("Close");
closeButton.setOnAction(event -> childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST)));

我認為在JavaFX中進行自動字段更新的最佳方法是使用屬性。 如果父窗口中的名稱字段綁定到SimpleStringProperty,則只需在子窗口關閉時設置屬性的值,以通知父窗口更新。

我做了一個小的父/子示例來測試這個概念,相關的代碼就是這個,放在子創建方法上:

FXMLLoader loader = new FXMLLoader(getClass().getResource("Child.fxml"));
Parent root = loader.load();
ChildController controller = loader.getController();
name.textProperty().bind(controller.name.textProperty());

字段名稱是父級中的Label和子級中的TextField。 子項文本的任何更改都會立即反映在父項中。

這是一個有趣的話題。 我將盡快制作一個完整的例子並在我的“一杯java”博客中發布。

如果使用彈出窗口,則可以將方法設置為showandwait,而不是僅從Stage對象中顯示,並在運行更新GUI的方法之后。 因為showandwait方法在彈出窗口運行時暫停主框架,所以一旦彈出窗口關閉,它將運行您的更新代碼。

stage.showAndWait();
updateGUI();

我們認為我們有兩個階段(窗口),1個父級階段,2個子窗口(彈出窗口)

  1. 首先將父級的階段對象發送到子階段

  2. 在兒童舞台集:

    childStage.setOnHidden(event->{ Parent root=FXMLLoader.load(getClass().getResource(parent fxml)); Scene scene=new Scene(root); parentStage.SetScene(scene); parentStage.show();

`

暫無
暫無

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

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