JavaFXでPopupMenuを表示するサンプルコード
JavaFXでポップアップメニューを作成表示するサンプルプログラムです。
下の動画のように、普通のメニューと、階層構造を持ったメニューを作りました。
手順
階層構造のない、普通のメニューの作る手順です。まずMenuItemを作ります。
MenuItem[] menui = new MenuItem[4];
menui[0] = new MenuItem( "定義" );
menui[1] = new MenuItem( "抑制" );
menui[2] = new SeparatorMenuItem();
menui[3] = new MenuItem( "削除" );
次にContextMenuを作り、これにMenuItemを設定。
ContextMenu menu = new ContextMenu();
menu.getItems().addAll( menui );
表示させるPane等にマウスクリック時のイベントでメニューを表示するようにします。
pane.addEventHandler( MouseEvent.MOUSE_CLICKED , e -> menu.show( pane , e.getScreenX() , e.getScreenY() ) );
最後にMenuItemが選択されたときのイベントを設定します。
for(int i=0;i<menui.length;i++){
menui[i].addEventHandler( ActionEvent.ACTION , e -> System.out.println( ((MenuItem)e.getSource()).getText()+"が選択されました" ) );
}
サンプルプログラム
上の動画左は下記コードを実行したものです。
package tomojavalib.fx;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.stage.Stage;
public class PopupMenuTest extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
FlowPane pane = new FlowPane();
this.setPopupMenu( pane );
Scene scene = new Scene(pane, 320, 240);
stage.setScene(scene);
stage.show();
}
private void setPopupMenu( Pane pane ){
// メニュー
ContextMenu menu = new ContextMenu();
MenuItem[] menui = new MenuItem[4];
menui[0] = new MenuItem( "定義" );
menui[1] = new MenuItem( "抑制" );
menui[2] = new SeparatorMenuItem();
menui[3] = new MenuItem( "削除" );
menu.getItems().addAll( menui );
for(int i=0;i<menui.length;i++){
menui[i].addEventHandler( ActionEvent.ACTION , e -> System.out.println( ((MenuItem)e.getSource()).getText()+"が選択されました" ) );
}
pane.addEventHandler( MouseEvent.MOUSE_CLICKED , e -> menu.show( pane , e.getScreenX() , e.getScreenY() ) );
}
}
ツリー構造にする場合の手順
右動画のようにするには、ContextMenu、MenuItemに加え、Menuを用意します。
Menuがツリーの分岐の役割をします。MenuItemはMenuまたはContextMenuに格納します。
ContextMenu menu = new ContextMenu();
Menu menu1 = new Menu( "ルート" );
Menu menu2 = new Menu( "子メニュー" );
MenuItem[] menui = new MenuItem[6];
menui[0] = new SeparatorMenuItem();
menui[1] = new MenuItem( "定義" );
menui[2] = new MenuItem( "抑制" );
menui[3] = new MenuItem( "削除" );
menui[4] = new MenuItem( "新規" );
menui[5] = new MenuItem( "追加" );
menu1.getItems().addAll( menu2, menui[0], menui[1], menui[2], menui[3] );
menu2.getItems().addAll( menui[4], menui[5] );
menu.getItems().addAll( menu1 );
PopupMenuの文字色変更
色を変更するメニューで、わかりやすいように文字の色を変えてみることにした。
変則的だけど、こんな感じで記述。
色データは、RGBデータでiro配列に格納。
ContextMenu ppmenuIro = new ContextMenu();
String[] menuitem = {"黒","赤","青","緑","灰","紫","茶","紺","黄","青緑","黄土","桃"};
MenuItem[] mi = new MenuItem[ menuitem.length ];
for(int i=0;i
Color c = new Color( (double)( iro[i][0] /255.) ,(double)(iro[i][1] /255.) ,(double)(iro[i][2] /255.),1.);
String tmps = c+""; tmps=tmps.replace("0x", "#");
mi[i].setStyle("-fx-text-fill: " + tmps + ";");
ppmenuIro.getItems().add(mi[i]);
//イベントを発生させる。
//mi[i].addActionListener( new ppmenuIroListModifyed() );
mi[i].addEventHandler( ActionEvent.ACTION , e -> System.out.println( ((MenuItem)e.getSource()).getText()+"が選択されました" ));
}
最終更新日: 2019-06-03 07:39:30