2016-07-03 27 views
0

的JavaFX關閉對話框我通過FXML創建Button和相關的onAction()方法沒有設定結果

<Button fx:id="cancelButton" cancelButton="true" mnemonicParsing="false" onAction="#cancelButtonAction" text="Cancel" /> 

按鈕應關閉Dialog但因爲它是一個取消按鈕,我不希望的結果集。 我的問題是,如果我沒有設置結果,對話框不會關閉。

Dialog<String> dialog = new Dialog<>(); 

public void cancelButtonAction(){ 
    System.out.println("cancel"); // this get's called 
    // dialog.setResult("foo"); // not working without this line 
    dialog.close();    // does not close the dialog 
} 

如何在不設置結果的情況下關閉對話框? Dialogue

具體規則:

+0

是否有理由通過FXML創建按鈕,而不是通過'Dialog'的'createButton'創建按鈕?查看[文檔](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Dialog.html) – Itai

回答

0

這是最有可能被這裏列出的對話規則造成

1. 如果對話框是正常關閉,如果對話框包含一個按鈕 符合以上兩個條件之一,對話框將嘗試 將result屬性設置爲通過第一個匹配的ButtonType調用 結果轉換器返回的任何值。

2. 如果出於任何原因的結果轉換器返回null,或者如果對話框 被關閉時僅一個非刪除按鈕是否爲存在,則結果 屬性將是無效,並且showAndWait()方法將返回 Optional.empty()。後面的這一點意味着,如果您使用 選項2或選項3(如前所述,此類 文檔中的任一個),將永遠不會調用Optional.ifPresent(java.util.function.Consumer) lambda,並且代碼將繼續執行,就好像 對話框根本沒有返回任何值。

3. JavaFX的對話框只能在 兩種情況被關閉「異常」(如上所定義): 當對話框只有一個按鈕,或者當對話框有多個 按鈕,只要它們中的一個滿足以下 要求之一: 該按鈕具有一個ButtonType,其ButtonData類型爲 ButtonData.CANCEL_CLOSE。該按鈕有一個ButtonType,當ButtonData.isCancelButton()被調用時,其ButtonData 返回true。

也許試試這個,如果你只是想,如果它不是關鍵的快速解決問題:

dialog.setResult(null); 
//Or this just to keep it simple 
dialog.setResult(""); 

提到一個帖子here有可能只需添加一個cancel_close按鈕來解決這個問題:

dialog.getDialogPane().getButtonTypes().add(new ButtonType("Cancel", ButtonData.CANCEL_CLOSE)); 
// or as jorn said you can simple do this : 
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); 

下面是一個完整的例子:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.Dialog; 
import javafx.stage.Stage; 


public class JavaFXApplication2 extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Button openDialog = new Button("Open Dialog"); 
     openDialog.setOnAction(event -> { 
      Dialog dialog = new Dialog(); 
      dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); 
      dialog.setContentText("Example"); 
      dialog.showAndWait(); 
     }); 

     stage.setScene(new Scene(openDialog)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+2

末尾的「對話框關閉規則」行,你也可以使用['''ButtonType.CANCEL'''](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ButtonType.html#CANCEL)。 –

+0

有效點:)我只是從其他帖子引用我鏈接爲das :) – D3181

+0

已更新,包括@Jorn解決方案的示例 – D3181