2016-04-30 45 views
4

我想使用標準JavaFX Alert類作爲確認對話框,其中包含「不要再詢問」複選框。這是可能的,還是我必須從頭創建自定義Dialog如何使用「不要再詢問」複選框創建JavaFX警報?

我嘗試使用DialogPane.setExpandableContent()方法,但那不是我真正想要的 - 這會在按鈕欄中添加一個隱藏/顯示按鈕,並且該複選框出現在對話框的主體中,而我想要複選框出現在按鈕欄中。

回答

5

是的,這是可能的,一點點的工作。您可以覆蓋DialogPane.createDetailsButton()以返回您想要代替隱藏/顯示按鈕的任何節點。訣竅是,之後需要重建Alert,因爲您將刪除由Alert創建的標準內容。你還需要欺騙DialogPane認爲有擴展的內容,以便它顯示你的複選框。下面是一個工廠方法示例,用於選擇退出複選框來創建Alert。複選框的文本和操作可自定義。

public static Alert createAlertWithOptOut(AlertType type, String title, String headerText, 
       String message, String optOutMessage, Consumer<Boolean> optOutAction, 
       ButtonType... buttonTypes) { 
    Alert alert = new Alert(type); 
    // Need to force the alert to layout in order to grab the graphic, 
    // as we are replacing the dialog pane with a custom pane 
    alert.getDialogPane().applyCss(); 
    Node graphic = alert.getDialogPane().getGraphic(); 
    // Create a new dialog pane that has a checkbox instead of the hide/show details button 
    // Use the supplied callback for the action of the checkbox 
    alert.setDialogPane(new DialogPane() { 
     @Override 
     protected Node createDetailsButton() { 
     CheckBox optOut = new CheckBox(); 
     optOut.setText(optOutMessage); 
     optOut.setOnAction(e -> optOutAction.accept(optOut.isSelected())); 
     return optOut; 
     } 
    }); 
    alert.getDialogPane().getButtonTypes().addAll(buttonTypes); 
    alert.getDialogPane().setContentText(message); 
    // Fool the dialog into thinking there is some expandable content 
    // a Group won't take up any space if it has no children 
    alert.getDialogPane().setExpandableContent(new Group()); 
    alert.getDialogPane().setExpanded(true); 
    // Reset the dialog graphic using the default style 
    alert.getDialogPane().setGraphic(graphic); 
    alert.setTitle(title); 
    alert.setHeaderText(headerText); 
    return alert; 
} 

這裏是正在使用的工廠方法的一個例子,其中prefs一些偏好商店,節省了用戶的選擇

Alert alert = createAlertWithOptOut(AlertType.CONFIRMATION, "Exit", null, 
        "Are you sure you wish to exit?", "Do not ask again", 
        param -> prefs.put(KEY_AUTO_EXIT, param ? "Always" : "Never"), ButtonType.YES, ButtonType.NO); 
    if (alert.showAndWait().filter(t -> t == ButtonType.YES).isPresent()) { 
     System.exit(); 
    } 

而這裏的對話框是什麼樣子:

enter image description here

+0

如何檢查「不再詢問」複選框是否被選中? –

+0

我建議使用'Consumer '而不是'Callable' – Mordechai

+0

是的,很好的調用MouseEvent,我用Callable更新了。使lambda處理選擇更好。 – ctg