JavaFXでインプットダイアログの結果をアラートで表示する

Java を勉強してみるぞシリーズ第 4 段。ボタンクリック → インプットダイアログ表示 → 入力 → 入力した値をアラートに入れて表示、というのを目指します。
関連記事
- 初めてJavaを触った人間がEclipseでJavaFXのGUIアプリを起動するまで
- JavaFX Scene BuilderでのContainers(土台)部の違いについて
- JavaFXでウィンドウにボタンを配置してクリックでメッセージを出力する
- JavaFXでインプットダイアログの結果をアラートで表示する ←NOW!
- JavaFXでテキストフィールドに値を入れたり取得したり
順番に見てもらったほうがわかりやすいと思います。
書いたときの環境
- JDK 8u121
- Eclipse4.6 NEON
- Scene Builder 8.3.0
- Windows7/10
です。
前回までのあらすじ
ボタンを作ってアクションイベント作って動くようにして、FormController.java というファイルに
package application; import javafx.event.ActionEvent; import javafx.fxml.FXML; public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { System.out.println("クリックされました!"); } }
このように書いて、

実行してボタンをクリックすると、

Eclipse のコンソールに、コード内に書いた文字列が出力される、というところまでやりました。今回はコンソールじゃなくて、アラートやインプットダイアログを使って出力してみたいと思います。
アラートを表示
onButtonClick メソッドの中身をアラートを出力する記述にします。アラートを使うために、5, 6 行目のインポートの記述も必要です。
package application; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { Alert alrt = new Alert(AlertType.INFORMATION); //アラートを作成 alrt.showAndWait(); //表示 } }
実行してボタンをクリックすると、

出ました。これは AlertType が INFORMATION の場合です。他のタイプにすると、以下のような見た目に。

CONFIRMATION

ERROR

WARNING
他にもいろんな形があるので、記事下の参考リンクをどうぞ。
任意のテキストにする
//略 public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { Alert alrt = new Alert(AlertType.INFORMATION); alrt.setTitle("タイトル"); alrt.setHeaderText("ヘッダー"); alrt.setContentText("テキスト"); alrt.showAndWait(); } }
こうすると、

テキストがこのように。ちょっとヘッダーの存在感が大きすぎるような気もしたので、
//略 public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { Alert alrt = new Alert(AlertType.INFORMATION); alrt.setTitle("タイトル"); alrt.setHeaderText(null); alrt.setContentText("テキスト"); alrt.showAndWait(); } }
setHeaderText を null にすると、

コンパクトになります。
OKボタンを検出する
上にも書いたように、AlertType を CONFIRMATION にすると、「OK」「取消」という 2 つのボタンが表示されます。ここで「OK」を押されたときのみ処理をしたい、ってことありますよね。
package application; import java.util.Optional; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { Alert alrt = new Alert(AlertType.CONFIRMATION); alrt.setTitle("タイトル"); alrt.setHeaderText(null); alrt.setContentText("テキスト"); Optional<ButtonType> result = alrt.showAndWait(); if (result.get() == ButtonType.OK) { //OKボタンがクリックされたら System.out.println("OKボタンがクリックされました"); //メッセージ } } }
こう書いてみると、

こう表示されます。「OK」を押したときだけ、

コンソールにテキストが表示されます。
インプットダイアログに入力した値をアラートへ出力
最後に、インプットダイアログとアラートを組み合わせてみます。
package application; import java.util.Optional; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.TextInputDialog; public class FormController { @FXML protected void onButtonClick(ActionEvent evt) { TextInputDialog iptDlg = new TextInputDialog(); iptDlg.setTitle("タイトル"); iptDlg.setHeaderText(null); iptDlg.setContentText("テキスト"); Optional<String> result = iptDlg.showAndWait(); result.ifPresent(value -> { //値があった場合 Alert alrt = new Alert(AlertType.INFORMATION); alrt.setTitle("入力結果"); alrt.setHeaderText(null); alrt.setContentText(value); //アラートのテキストに値を入れる alrt.showAndWait(); }); } }
実行してみると、

インプットダイアログが出て、テキストを入れて「OK」を押すと、

入力した値がアラートのテキストに入って、表示されます。
参考
ありがとうございました! 不適切な部分や間違ってるぞコノヤロウ的なところがありましたらご指摘ください。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。