4
我想使用標準JavaFX Alert
類作爲確認對話框,其中包含「不要再詢問」複選框。這是可能的,還是我必須從頭創建自定義Dialog
?如何使用「不要再詢問」複選框創建JavaFX警報?
我嘗試使用DialogPane.setExpandableContent()
方法,但那不是我真正想要的 - 這會在按鈕欄中添加一個隱藏/顯示按鈕,並且該複選框出現在對話框的主體中,而我想要複選框出現在按鈕欄中。
我想使用標準JavaFX Alert
類作爲確認對話框,其中包含「不要再詢問」複選框。這是可能的,還是我必須從頭創建自定義Dialog
?如何使用「不要再詢問」複選框創建JavaFX警報?
我嘗試使用DialogPane.setExpandableContent()
方法,但那不是我真正想要的 - 這會在按鈕欄中添加一個隱藏/顯示按鈕,並且該複選框出現在對話框的主體中,而我想要複選框出現在按鈕欄中。
是的,這是可能的,一點點的工作。您可以覆蓋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();
}
而這裏的對話框是什麼樣子:
如何檢查「不再詢問」複選框是否被選中? –
我建議使用'Consumer'而不是'Callable' –
Mordechai
是的,很好的調用MouseEvent,我用Callable更新了。使lambda處理選擇更好。 – ctg