はい、多少の作業で可能です。 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();
}
を保存し、いくつかのプリファレンス・ストアであり、ここで、ダイアログは次のようになります。ここで
出典
2016-04-30 00:59:07
ctg
[再度確認しない]チェックボックスがオンになっているかどうかを確認するにはどうすればよいですか? –
'Callable'の代わりに' Consumer 'を使用することをお勧めします –
Mordechai
いいえ、MouseEventを呼び出して、Callableで更新しました。ラムダがオプトアウトをより素早く処理するようにします。 – ctg