ともさんのHP >プロブラミング >JavaFX >メニューバー

JavaFX/Swingメニューバー

JavaFXとSwingでメニューバーを表示するサンプルプログラムを紹介します。
メニューバーをJframe(Swing)またはPane(FX)に設置し、メニューアイテムを選択したら、ラベルの文字を変更するようにしています。

広告


左がSwing、右がFXでの実行動画です。

Classの構造

どちらもメニューバー自体をClass化してその中にメニューとメニューアイテム、イベントを格納しています。
メニューバーの初期化時に親のJframeまたはApplicationを取り込むことで、イベントの対応を親のラベルに返します。

FXのサンプルプログラム

まずはApplicationクラス。
stageを作り、BorderPaneを置いて、そこにメニューバーClassとラベルを貼り付けます。
メニューを選ぶとラベルが書き換えられますが、これはメニューバーの方で行います。

package tomojavalib.swingfx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class MenuBarTestStage extends Application {
public Label l = null;

 public static void main(String[] args) {
  Application.launch(args);
 }

 @Override
 public void start(Stage stage) throws Exception {
  BorderPane pane = new BorderPane();
  Scene scene = new Scene(pane, 320, 240);
  l = new Label("a");
  pane.setCenter(l);
  MenuBarTestFx  menuBar = new MenuBarTestFx( this );
  pane.setTop(menuBar);
  stage.setScene(scene);
  stage.show();
 }

}


MenuBarの拡張Classを作って、この中にMenu、MenuItem、イベントを格納します。
Applicationの中にいろいろ記述するよりすっきりするのでこの構成にしました。
メニューを作るには、MenuBarとMenu、MenuItemを作り、MenuBarにMenuを登録、MenuにMenuItemを登録、
そしてMenuItemにイベントを登録します。
JavaFXMenu

最初にこのMenuBarを設置する親Applicationを読み込んでいるので、イベント発生時にApplication内のラベルを書き換えることができます。

package tomojavalib.swingfx;

import javafx.event.ActionEvent;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;

public class MenuBarTestFx  extends MenuBar{
//親アプリ
MenuBarTestStage  ap = null;

//メニューバーに付けるメニュー
Menu menu1 = null;
Menu menu2 = null;

//メニューバーにつけるメニューアイテム
public MenuItem menuitem11 = null;
public MenuItem menuitem12 = null;
public MenuItem menuitem21 = null;
public MenuItem menuitem22 = null;

public MenuBarTestFx( MenuBarTestStage  ap ){
this.ap = ap;
this.setMenuBar();
}

/**
 * メニューバーにメニューを設置する
 */
public void setMenuBar(){

 //menu1にメニューアイテムを登録する
 menu1 = new Menu("ファイル");
 menuitem11 = new MenuItem("新規作成");
 menuitem11.addEventHandler( ActionEvent.ACTION , e -> this.event( menuitem11.getText() ) );
 menu1.getItems().add(menuitem11);
 menu1.getItems().add( new SeparatorMenuItem() );
 menuitem12 = new MenuItem("開く");
 menuitem12.addEventHandler( ActionEvent.ACTION , e -> this.event( menuitem12.getText() ) );
 menu1.getItems().add(menuitem12);

 //menu2にメニューアイテムを登録する
 menu2 = new Menu("設定");
 menuitem21 = new MenuItem("設定1");
 menuitem21.addEventHandler( ActionEvent.ACTION , e -> this.event( menuitem21.getText() ) );
 menu2.getItems().add(menuitem21);
 menu2.getItems().add( new SeparatorMenuItem() );
 menuitem22 = new MenuItem("設定2");
 menuitem22.addEventHandler( ActionEvent.ACTION , e -> this.event( menuitem22.getText() ) );
 menu2.getItems().add(menuitem22);

 //メニューバーにメニューを登録
 this.getMenus().add( menu1 );
 this.getMenus().add( menu2 );
}

//イベントの受付
private void event(String s){
 if ( s.equals( "新規作成" )) {
   ap.l.setText( "新規作成" );
  }else if ( s.equals( "開く" )) {
   ap.l.setText( "開く" );
  }else if ( s.equals( "設定1" )) {
   ap.l.setText( "設定1" );
  }else if ( s.equals( "設定2" )) {
   ap.l.setText( "設定2" );
  }
}

}


Swingのサンプルプログラム

SwingもFXと同様にJframeとJMenuBarの2クラスに分けています。
まずはJframe。JpanelをJfarameにおき、そこにラベルを置きます。
JmenubarはJframeに置きます。

package tomojavalib.swingfx;

import javax.swing.Jframe;
import javax.swing.Jlabel;
import javax.swing.Jpanel;

public class MenuBarTestFrame extends Jframe {
public Jlabel l = null;

/*コンストラクタ*/
public MenuBarTestFrame()
{
 //サイズ設定
 this.setBounds(500, 500, 320, 240);
 //タイトル設定
 this.setTitle("SWING");
 Jpanel pane = new Jpanel();
 add(pane);
 l = new Jlabel("a");
 pane.add(l);
 MenuBarTestSwing mb = new MenuBarTestSwing(this);
 this.setJMenuBar( mb );
}

public static void main(String[] args) {
 MenuBarTestFrame ets = new MenuBarTestFrame();
 ets.setVisible(true);
}

}


次にJmenuBar。FXと同様にメニュー、メニューアイテムを作り、メニューバーへメニューを登録、メニューへメニューアイテムを登録。
メニューアイテムにイベントを登録します。
FXと同様に親のJframeを読み込んでいるので、イベント時にフレーム上のラベルを書き換えるようにしています。

広告

package tomojavalib.swingfx;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Jmenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuBarTestSwing  extends JMenuBar{
//親フレーム
MenuBarTestFrame f=null;

//メニューバーに付けるメニュー
Jmenu menu1 = null;
Jmenu menu2 = null;

//メニューバーにつけるメニューアイテム
public JMenuItem menuitem11 = null;
public JMenuItem menuitem12 = null;
public JMenuItem menuitem21 = null;
public JMenuItem menuitem22 = null;

public MenuBarTestSwing(MenuBarTestFrame f){
this.f = f;
this.setMenuBar();
}

/**
 * フレームにメニューバーを設置する
 */
public void setMenuBar(){

 //menu1にメニューアイテムを登録する
 menu1 = new Jmenu("ファイル");
 menuitem11 = new JMenuItem("新規作成");
 menuitem11.addActionListener( new menuBarEvent() );
 menu1.add(menuitem11);
 menu1.addSeparator();
 menuitem12 = new JMenuItem("開く");
 menuitem12.addActionListener( new menuBarEvent() );
 menu1.add(menuitem12);

 //menu2にメニューアイテムを登録する
 menu2 = new Jmenu("設定");
 menuitem21 = new JMenuItem("設定1");
 menuitem21.addActionListener( new menuBarEvent() );
 menu2.add(menuitem21);
 menu2.addSeparator();
 menuitem22 = new JMenuItem("設定2");
 menuitem22.addActionListener( new menuBarEvent() );
 menu2.add(menuitem22);

 //メニューバーにメニューを登録
 this.add( menu1 );
 this.add( menu2 );
}

//イベントの受付
class menuBarEvent implements ActionListener {
 public void actionPerformed(ActionEvent e){
  if ( e.getActionCommand() == "新規作成" ) {
   f.l.setText( "新規作成" );
  }else if ( e.getActionCommand() == "開く" ) {
   f.l.setText( "開く" );
  }else if ( e.getActionCommand() == "設定1" ) {
   f.l.setText( "設定1" );
  }else if ( e.getActionCommand() == "設定2" ) {
   f.l.setText( "設定2" );
  }
}}

}


SwingとFXの違い

メニュークラスはSwingとFXで異なるので使い分けます。
最初にJが付くのがSwing、ないのがFX。Jmenu→Swing用、Menu→FX用。
メニューバーは、SwingはJframeであるのに対し、FXはPaneになっています。
また、addの記述、イベントの記述も異なっています。

最終更新日: 2019-11-25 09:14:50

ともさんのHP >プロブラミング >JavaFX >メニューバー

広告
新着ページ

AIを利用し、衣服のデザイン画から型紙を制作する方法  
2つのアパレル3D技術でひらくオーダーメイド生産の手法  
【洋裁型紙】前後身頃の肩の傾きは何故前身頃の方が傾いているのか  
電子追尾式天体写真撮影法  
日本ミツバチ巣箱の種類  
ドラフター(製図台)でソーイング  
日本ミツバチが逃亡  
カメさんの箱庭  
天体用デジタルカメラの構造と天体写真  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
USBカメラをJAVAで制御  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

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