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にイベントを登録します。
最初にこの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