簡體   English   中英

javaFX中的dialog和parent Controller之間如何通信

[英]How to communicate between a dialog and parent Controller in javaFX

我有一個 MainController,當我按下某個按鈕時,該 MainController class 會彈出一個自定義對話框(從自定義 FXML 文件加載)。現在,在該對話框中,有一些文本輸入字段和一個按鈕。 當我按下該按鈕時,對話框應該關閉,輸入字段中的數據應該發送到父級 controller(在本例中是 MainController)。 到目前為止,我想到了一種方法:

  1. 首先,通過使用 singleton class 來存儲值
  2. 二、通過創建對話框時通過loader方法發送對話框實例
DialogController dialogController = loader.getController();
dialogController.setContent(dialog);

但是這樣,我擔心會出現 memory 泄漏等問題。 有沒有更好的方法來做到這一點,比如使用接口? 一些幫助將不勝感激!

到目前為止我的代碼:

主控制器.java

 private void openDialog() {
        try {
            JFXDialogLayout content = new JFXDialogLayout();
            FXMLLoader loader = new FXMLLoader(getClass().getResource("dialogs/dialog.fxml"));
            loader.load();
            JFXDialog dialog = new JFXDialog(stackPaneRoot, loader.getRoot(), JFXDialog.DialogTransition.CENTER);
            DialogController dialogController = loader.getController();
            dialogController.setContent(dialog);
            dialog.show();
        } catch (Exception e) {
            e.printStackTrace();
     }
 }

DialogController.java

public class DialogController {

    @FXML
    private TextField nameInput;
    private JFXDialog dialog;

    @FXML
    void onCloseClick(ActionEvent event) {
        dialog.close();
        // Util is the singleton class to store the data
        Util.getInstance().setName(nameInput.getText());
    }

    public void setContent(JFXDialog dialog) {
        this.dialog = dialog;
    }
}

在我的應用程序中,我得到了以下結果。 基本上,當用戶單擊“添加用戶”按鈕時,我會在主視圖上調用我的 addUser 方法。 我將普通對話框 object 的窗格設置為我的 NewUserDialog.fxml(順便說一句,我正在使用場景生成器)。 您將在下面的示例中看到。 這是我發現的最 eloquent 方法,無需求助於 static 類。

請注意,我的 NewUserDialog.fxml 不能包含對 controller 的引用,因為在 FXMLLoader object 中,我們使用 setController 方法傳入我們實例化的 controller。 我們等待用戶向 select 申請,然后調用公共控制器的 getData() 方法,它只返回一個字符串的 firstNameField。

這樣,您可以使用構造函數或方法將對象注入 controller class,或者只在 controller 中創建一個公共 function,返回數據的 object model 和 8388863706

private void addUser(ActionEvent event) {
        newDialog = new Dialog();
        FXMLLoader loader = new FXMLLoader(app.getClass().getResource("fxml/NewUserDialog.fxml"));
        newUserController = new NewUserDialogController();
        loader.setController(newUserController);
        try {
            newDialog.setDialogPane(loader.load());   
        } catch (Exception e) {
            throw new Error("Add user dialog class could not load: \n" + e);
        }
        
        Optional<ButtonType> result = newDialog.showAndWait();
        if (result.get() == ButtonType.APPLY){
            System.out.println(newUserController.getData());
        } else {
            System.out.println("Cancel");
        }
}

這是我的對話 controller

public class NewUserDialogController implements Initializable {

@FXML
private TextField firstNameField;
@FXML
private TextField lastNameField;
@FXML
private TextField middleNameField;
@FXML
private TextField profileNameField;
@FXML
private ComboBox<?> roleComboBox;

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    
}    

public String getData() {
    return firstNameField.getText();
}
}

暫無
暫無

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

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