階層化メニューの作成

広告

メニューにはメニューアイテムを追加することができますが、メニューを表すJMenuクラスはメニューアイテムを表すJMenuItemクラスのサブクラスとなっておりメニューもメニューアイテムの一つと考えることができます。

java.lang.Object
 L java.awt.Component
     L java.awt.Container
         L javax.swing.JComponent
             L javax.swing.AbstractButton
                 L javax.swing.JMenuItemjavax.swing.JMenu

そこでメニューの中にメニューアイテムと同じようにメニューを追加することが可能です。(ここでは分かりやすくするためにサブメニューと呼びます)。

メニューの中に追加されるサブメニューもメニューですので、メニューアイテムを追加することができます。またサブメニューの中にさらに別のメニューを追加することもできます。このような使い方をすることで階層化したメニューを作成することができます。

例えば一つのメニューを次のようにしたい場合で考えてみます。(サブメニューは[]で囲ってあります)。

New
Open
[Encode]
  UTF-8
  Shift_JIS
  EUC
Save
Close

上記を実現するためには次のように記述します。

JMenu submenu = new JMenu("Encode");

JMenuItem submenuitem1 = new JMenuItem("UTF-8");
JMenuItem submenuitem2 = new JMenuItem("Shift_JIS");
JMenuItem submenuitem3 = new JMenuItem("EUC");

submenu.add(submenuitem1);
submenu.add(submenuitem2);
submenu.add(submenuitem3);

JMenu menu = new JMenu("File");

JMenuItem menuitem1 = new JMenuItem("New");
JMenuItem menuitem2 = new JMenuItem("Open");
JMenuItem menuitem3 = new JMenuItem("Save");
JMenuItem menuitem4 = new JMenuItem("Close");

menu.add(menuitem1);
menu.add(menuitem2);
menu.add(submenu);
menu.add(menuitem3);
menu.add(menuitem4);

今回は2階層だけですが、同じように何階層のメニューでも作成することができます。

サンプルプログラム

では実際に試してみます。

SSample19_1.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.Container;
import java.awt.BorderLayout;

class SSample19_1 extends JFrame{
  JLabel label;

  public static void main(String args[]){
    SSample19_1 frame = new SSample19_1("タイトル");
    frame.setVisible(true);
  }

  SSample19_1(String title){
    setTitle(title);
    setBounds(100, 100, 300, 250);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenuBar menubar = new JMenuBar();
    JMenu menu1 = new JMenu("File");
    JMenu menu2 = new JMenu("Edit");
    JMenu menu3 = new JMenu("Tool");
    JMenu menu4 = new JMenu("Help");

    menubar.add(menu1);
    menubar.add(menu2);
    menubar.add(menu3);
    menubar.add(menu4);

    JMenu submenu = new JMenu("Encode");

    JMenuItem submenuitem1 = new JMenuItem("UTF-8");
    JMenuItem submenuitem2 = new JMenuItem("Shift_JIS");
    JMenuItem submenuitem3 = new JMenuItem("EUC");

    submenu.add(submenuitem1);
    submenu.add(submenuitem2);
    submenu.add(submenuitem3);

    JMenuItem menuitem1_1 = new JMenuItem("New");
    JMenuItem menuitem1_2 = new JMenuItem("Open");
    JMenuItem menuitem1_3 = new JMenuItem("Save");
    JMenuItem menuitem1_4 = new JMenuItem("Close");

    menu1.add(menuitem1_1);
    menu1.add(menuitem1_2);
    menu1.add(submenu);
    menu1.add(menuitem1_3);
    menu1.add(menuitem1_4);

    setJMenuBar(menubar);

    JPanel p = new JPanel();

    label = new JLabel();
    p.add(label);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}

ではコンパイルを行った上で実行してみます。

階層化メニューの作成

では「File」メニューをクリックして下さい。

階層化メニューの作成

メニューアイテムの中にサブメニューも追加されています。サブメニューには文字列の後に右矢印が付いていてメニューアイテムと区別が付くようになっています。

では「Encode」メニューにマウスを合わせて下さい。

階層化メニューの作成

階層化メニューの作成

サブメニューの中に追加されているメニューアイテムが表示されます。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。