JavaFXでメニュバーを作成・イベントを登録する方法について記載します。
目次
メニュバーを作成・イベントを登録する方法
メニュバーを作成するには、MenuBarクラス・Menuクラス と MenuItemクラス を組み合わせて使用します。
メニューバーを表すクラス。
メニューバーに表示する各メニューを表すクラス。
メニューバーに複数のメニューを表示する場合は、各メニュー毎にMenuクラスのインスタンスを作成します。
各メニューに表示するアイテムを表すクラス。
各メニューに複数のアイテムを表示する場合は、各アイテム毎日にMenuItemクラスのインスタンスを作成します。
次の実行例ではメニューバーに3つのメニュー(メニューA・B・C)を作成しています。
メニューA
処理を終了するためのExitアイテムを表示します。
Exitアイテムがクリックされるとプログラムを終了するイベントが実行されます。
メニューB
各アイテムにイベントを設定しています。
各アイテムをクリックすると画面中央のラベルにテキストが表示されます。
また、アイテムを区切るセパレーターも表示します。
メニューC
多階層となるメニューを表示します。
実行例
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 |
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { // イベント実行時のメッセージ表示用ラベル final Label lblMessage = new Label(); @Override public void start(Stage pStage) { /* メニューA -------------------- */ Menu menuA = new Menu("メニューA"); MenuItem menuAItem1 = new MenuItem("Exit"); menuAItem1.setOnAction((ActionEvent t) -> { System.exit(0); }); menuA.getItems().addAll( menuAItem1 ); /* ---------------------------- */ /* メニューB -------------------- */ Menu menuB = new Menu("メニューB"); MenuItem menuBItem1 = new MenuItem("item-B1"); menuBItem1.setOnAction(new ItemEvent()); // イベントを設定 MenuItem menuBItem2 = new MenuItem("item-B2"); menuBItem2.setOnAction(new ItemEvent()); // イベントを設定 MenuItem menuBItem3 = new MenuItem("item-B3"); menuBItem3.setOnAction(new ItemEvent()); // イベントを設定 menuB.getItems().addAll( menuBItem1, menuBItem2, new SeparatorMenuItem(), menuBItem3 ); /* ---------------------------- */ /* メニューC -------------------- */ Menu menuC = new Menu("メニューC"); MenuItem menuCItem1 = new MenuItem("item-C1"); Menu menuCSub1 = new Menu("子メニュー"); menuC.getItems().addAll( menuCItem1, menuCSub1 ); // 子メニューにアイテム2を追加 MenuItem menuCItemSub1 = new MenuItem("item-sub-C1"); MenuItem menuCItemSub2 = new MenuItem("item-sub-C2"); menuCSub1.getItems().addAll( menuCItemSub1, menuCItemSub2 ); /* ---------------------------- */ /* メニューバーを作成・メニューを追加 */ MenuBar menuBar = new MenuBar(); menuBar.getMenus().addAll( menuA, menuB, menuC ); /* 配置 */ /* ラベルの設定 */ lblMessage.setAlignment(Pos.CENTER); /* 配置 */ VBox vbMessage = new VBox(); vbMessage.setMinHeight(250); vbMessage.setAlignment(Pos.CENTER); vbMessage.getChildren().addAll(lblMessage); VBox root = new VBox(); root.getChildren().addAll(menuBar,vbMessage); pStage.setTitle("Menu"); pStage.setWidth(400); pStage.setHeight(300); pStage.setScene(new Scene(root)); pStage.show(); } // EventHandlerインタフェースを実装したクラス class ItemEvent implements EventHandler<ActionEvent> { @Override public void handle(ActionEvent event) { // イベント発生元のオブジェクトを取得 MenuItem mitem = (MenuItem)event.getTarget(); // ラベルにアイテム名を表示 lblMessage.setText( mitem.getText() + "が選択されました。" ); } } public static void main(String[] args){ Application.launch(args); } } |
1. メニューバーの作成
メニューバーを作成するには、MenuBarクラスのインスタンスを作成します。
また、メニューバーにメニューを追加するには、add もしくは addAll メソッドを使用します。
2. メニューの作成
メニューを作成するには、Menuクラスのインスタンスを作成します。
コンストラクの引数には、表示名を指定します。
また、メニューにアイテムを追加するには、add もしくは addAll メソッドを使用します。
3. アイテムの作成
メニューに表示するアイテムを作成するには、MenuItemクラスのインスタンスを作成します。
コンストラクタの引数には、表示名を指定します。
4. アイテムにイベントを登録
アイテムクリック時のイベントを登録するには、setOnActionメソッドを使用します。
メニューAのようにラムダ式を使用してイベントを処理する方法や、メニューBのようにイベント用の独自クラスを作成して処理を行います。
ラムダ式を使用してイベント処理を記述
1 2 3 4 |
MenuItem menuAItem1 = new MenuItem("Exit"); menuAItem1.setOnAction((ActionEvent t) -> { System.exit(0); }); |
イベント用の独自クラスを作成してイベント処理を記述
イベント用の独自クラスでは、EventHandler<ActionEvent>インタフェースを実装する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
MenuItem menuBItem1 = new MenuItem("item-B1"); menuBItem1.setOnAction(new ItemEvent()); // イベントを設定 // EventHandlerインタフェースを実装したクラス class ItemEvent implements EventHandler<ActionEvent> { @Override public void handle(ActionEvent event) { // イベント発生元のオブジェクトを取得 MenuItem mitem = (MenuItem)event.getTarget(); // ラベルにアイテム名を表示 lblMessage.setText( mitem.getText() + "が選択されました。" ); } } |
5. アイテムをセパレーターで区切る
アイテムをセパレーターで区切るには、SeparatorMenuItemクラスのインスタンスを作成します。
メニューにアイテムを追加する際に、区切りたい箇所で new SeparatorMenuItem() とインスタンスを生成すると区切ることが出来ます。
1 |
menuB.getItems().addAll( menuBItem1, menuBItem2, new SeparatorMenuItem(), menuBItem3 ); |
6. 多階層メニューを作成
多階層メニューを作成するには、メニューCのように、親となるMenu( 以下 menuC )に 子となるMenu( 以下 menuSub1 )を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
/* メニューC -------------------- */ Menu menuC = new Menu("メニューC"); MenuItem menuCItem1 = new MenuItem("item-C1"); Menu menuCSub1 = new Menu("子メニュー"); menuC.getItems().addAll( menuCItem1, menuCSub1 ); // 子メニューにアイテム2を追加 MenuItem menuCItemSub1 = new MenuItem("item-sub-C1"); MenuItem menuCItemSub2 = new MenuItem("item-sub-C2"); menuCSub1.getItems().addAll( menuCItemSub1, menuCItemSub2 ); |
7. その他のメニューアイテム
上記で作成したメニューアイテムは基本的な物で、チェック付きのアイテムを作成することも出来ます。
詳細は以下のリンクを参照してください。