ともさんのHP >プロブラミング >JavaFX >JavaFXでPopupMenu

JavaFXでPopupMenuを表示するサンプルコード

JavaFXでポップアップメニューを作成表示するサンプルプログラムです。
下の動画のように、普通のメニューと、階層構造を持ったメニューを作りました。
JavaFXPopupMenu動画 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の文字色変更

JavaFXPopupMemuの色変更

色を変更するメニューで、わかりやすいように文字の色を変えてみることにした。
変則的だけど、こんな感じで記述。
色データは、RGBデータでiro配列に格納。

ContextMenu ppmenuIro = new ContextMenu();
String[] menuitem = {"黒","赤","青","緑","灰","紫","茶","紺","黄","青緑","黄土","桃"};
MenuItem[] mi = new MenuItem[ menuitem.length ];
for(int i=0;i mi[i] = new MenuItem( menuitem[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()+"が選択されました" ));
}

最終更新日: 2017-11-18 09:22:19

ともさんのHP >プロブラミング >JavaFX >JavaFXでPopupMenu

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

ツールチップの表示  
アイコンの差し替え  
日本ミツバチ用重箱式巣箱の各部名称と機能  
柿の消毒  
IMEの自動設定  
みつばち日記  
初心者用巣箱その1  
アプリ終了時にダイアログを表示  
書類の整理方法  
人用の型紙をドール用に変換  
スイートピーの栽培、手入れ、増やしかた  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます