2016-04-30 8 views
4

標準のJavaFX Alertクラスを使用して、確認ダイアログに「再確認しない」チェックボックスが含まれていることを確認します。これが可能ですか、またはカスタムDialogをゼロから作成する必要がありますか?「もう一度聞かないでください」のチェックボックスを使ってJavaFX Alertを作成するにはどうすればよいですか?

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

'Callable'の代わりに' Consumer 'を使用することをお勧めします – Mordechai

+0

いいえ、MouseEventを呼び出して、Callableで更新しました。ラムダがオプトアウトをより素早く処理するようにします。 – ctg

関連する問題