JavaFXでカスタムダイアログを作成する方法について記載します。
1. カスタムダイアログを作成する方法
カスタムダイアログを作成するには、Stageを継承した独自クラスを作成して、ラベルやボタンなどのコントロールを配置します。
次の実行例では、Stageを継承した CustomDialog1 クラスでカスタムダイアログを作成して、SampleCustom1クラスから呼び出しています。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; import javafx.stage.Window; public class SampleCustom1 extends Application { @Override public void start(Stage pStage) throws Exception { /** * ボタンの定義 */ Button btnShowDlg = new Button("カスタムダイアログを表示"); btnShowDlg.setPrefHeight(50); btnShowDlg.setPrefWidth(180); btnShowDlg.setOnAction( new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { // ダイアログを表示 Stage customDlg = new CustomDialog1( pStage, "タイトル", "メッセージ" ); customDlg.show(); } }); /** * VBoxにボタンを追加 */ VBox vbox = new VBox(); vbox.setAlignment(Pos.CENTER); // VBox内で中央位置に合わせる vbox.setSpacing(20); // 各コンロール間の垂直方向のスペース vbox.getChildren().add( btnShowDlg ); pStage.setTitle("CustomDialog"); pStage.setHeight(200); pStage.setWidth(300); pStage.setScene( new Scene( vbox ) ); pStage.show(); } public static void main(String[] args){ Application.launch(args); } } /** * カスタムダイアログ用のクラス */ class CustomDialog1 extends Stage { /** * コンストラクタ * @param window * @param title : ダイアログのタイトル * @param msg : ダイアログのメッセージ */ public CustomDialog1( Window window, String title, String msg ) { setTitle("カスタムダイアログ"); initStyle(StageStyle.DECORATED); initOwner(window); initModality(Modality.APPLICATION_MODAL); setResizable(false); // ウィンドウのリサイズ不可 /** * タイトル用のラベル */ Label lblTitle = new Label(); lblTitle.setMinHeight(50); lblTitle.setPrefWidth(300); lblTitle.setAlignment(Pos.CENTER_LEFT); lblTitle.setStyle("-fx-padding: 10 10 10 10; -fx-border-color: #ddd; -fx-border-width : 0 0 1 0 "); lblTitle.setText(title); /** * メッセージ用のラベル */ Label lblMessage = new Label(); lblMessage.setPrefHeight(100); lblMessage.setPrefWidth(300); lblMessage.setAlignment(Pos.CENTER_LEFT); lblMessage.setStyle("-fx-background-color: #eee;-fx-padding: 10 10 10 10;"); lblMessage.setText(msg); /** * フッター */ Button btnOk = new Button("OK"); btnOk.setPrefHeight(30); btnOk.setPrefWidth(100); btnOk.setOnAction( event -> { System.out.println("OKボタンの処理"); }); Button btnCancel = new Button("Cancel"); btnCancel.setPrefHeight(30); btnCancel.setPrefWidth(100); btnCancel.setOnAction( event -> { System.out.println("Cancelボタンの処理"); close(); // ダイアログを閉じる }); HBox hboxFooter = new HBox(); hboxFooter.setPrefHeight(50); hboxFooter.setPrefWidth(300); hboxFooter.setAlignment(Pos.CENTER); hboxFooter.setSpacing(30); hboxFooter.setStyle("-fx-padding: 10 0;"); hboxFooter.getChildren().addAll( btnOk, btnCancel ); /** * タイトル、コンテンツ、ボタンを配置 */ VBox vbRoot = new VBox(); vbRoot.setPrefHeight(200); vbRoot.setPrefWidth(300); vbRoot.setAlignment(Pos.CENTER); vbRoot.getChildren().addAll(lblTitle, lblMessage, hboxFooter); setScene( new Scene(vbRoot) ); } } |