68K World   /   Java   AWT   Menu

ホーム

AWT

Java の AWT(Abstract Window Toolkit)を使った GUI アプリケーションを Mac OS 8.1 で作っています。Mac OS 8.1 では、Java のバージョンは JDK 1.1.3 になります。

このコーナーを始める前に Java EssentialJava AWT を見ておいた方が良いでしょう。

なお Java はファイル名とクラス名を同じにしなければならないので、このコーナーでは、ファイル名は Hello.java、クラス名は Hello と決めています。

Menu

AWT のメニューは次のような構成になっています。

メニューバーMenuBar
メニューバーに表示される各メニューMenu
各メニューをクリックした時に表示されるメニューアイテム MenuItem
セパレーターaddSeparator メソッドで追加
イベントリスナーActionListener
イベントリスナーメソッドactionPerformed(ActionEvent e)

Hello.java


import java.awt.*;
import java.awt.event.*;

class Hello extends WindowAdapter implements ActionListener {
    static Label label;
    public static void main(String[] args) {
        Frame frame = new Frame("Menu");
        frame.setSize(200, 100);
        frame.addWindowListener(new Hello());
        label = new Label("Label");
        frame.add(label);

        // MenuBar
        MenuBar menuBar = new MenuBar();
        frame.setMenuBar(menuBar);

        // FileMenu
        Menu menuFile = new Menu("File");
        menuBar.add(menuFile);
        menuFile.addActionListener(new Hello());
        MenuItem menuNew  = new MenuItem("New",  new MenuShortcut('N'));
        MenuItem menuOpen = new MenuItem("Open", new MenuShortcut('O'));
        MenuItem menuSave = new MenuItem("Save", new MenuShortcut('S'));
        MenuItem menuQuit = new MenuItem("Quit", new MenuShortcut('Q'));
        menuFile.add(menuNew);
        menuFile.add(menuOpen);
        menuFile.add(menuSave);
        menuFile.addSeparator();
        menuFile.add(menuQuit);

        // EditMenu
        Menu menuEdit = new Menu("Edit");
        menuBar.add(menuEdit);
        menuEdit.addActionListener(new Hello());
        MenuItem menuUndo = new MenuItem("Undo", new MenuShortcut('U'));
        MenuItem menuRedo = new MenuItem("Redo", new MenuShortcut('R'));
        MenuItem menuCut  = new MenuItem("Cut",  new MenuShortcut('X'));
        MenuItem menuCopy = new MenuItem("Copy", new MenuShortcut('C'));
        MenuItem menuPast = new MenuItem("Paste",new MenuShortcut('V'));
        menuEdit.add(menuUndo);
        menuEdit.add(menuRedo);
        menuEdit.addSeparator();
        menuEdit.add(menuCut);
        menuEdit.add(menuCopy);
        menuEdit.add(menuPast);

        frame.show();
        
    }
    public void windowClosing  (WindowEvent e) {System.exit(0);}
    public void actionPerformed(ActionEvent e) {
        label.setText(e.getActionCommand());
    }
}
    

コード説明

  1. class Hello extends WindowAdapter implements ActionListener {
    メニューのイベントも ActionListener で処理します。
  2. MenuBar menuBar = new MenuBar();
    メニューバーは new Menubar(); で作ります。
  3. frame.setMenuBar(menuBar);
    メニューバーはウィンドウ(フレーム)の setMenubar で、アプリケーションウィンドウのメニューとして設定します。macOS の場合は、メニューは常にデスクトップのメニューバーに表示されます。
  4. Menu menuFile = new Menu("File");
    メニューバーに表示される各メニューは、new Menu で作ります。
  5. menuBar.add(menuFile);
    メニューは、メニューバーの add メソッドでメニューバーに追加します。
  6. menuFile.addActionListener(new Hello());
    メニューのイベントリスナーは、メニューアイテム(,メニュー項目)ではなく、メニューに設定します。
  7. MenuItem menuNew = new MenuItem("New", new MenuShortcut('N'));
    メニューアイテムは new MenuItem で作ります。そしてショートカットは new MenuShortcut で作ります。
  8. menuFile.add(menuNew);
    メニューアイテムは、メニューの add メソッドでメニューに追加します。
  9. menuFile.addSeparator();
    セパレーターは、addSeparetor メソッドでメニューに追加します。
  10. label.setText(e.getActionCommand());
    ActionEvent の getActionCommand メソッドで、洗濯したメニューアイテムに設定した文字列が取得できます。

実行結果

Hello.java を javac でコンパイル(Do Javac)し、作成された Hello.class を JBindery でアプリケーションとして保存します。そして作成されたアプリケーションをダブルクリックで起動します。


選択したメニュアイテムがラベルに表示されます。
Mac OS 8.1 では、アップルメニューは常に表示され、ヘルプメニューは自動的に作られます。

CheckboxMenuItem

AWT はチェックメニューもサポートしています。構成は次のとおりです。

チェックメニューアイテムCheckboxMenuItem
イベントリスナーItemListener
イベントリスナーメソッドitemStateChanged(ItemEvent e)

Hello.java


import java.awt.*;
import java.awt.event.*;

class Hello extends WindowAdapter implements ItemListener {
    static Label label;
    public static void main(String[] args) {
        Frame frame = new Frame("CheckboxMenuItem");
        frame.setSize(200, 100);
        frame.addWindowListener(new Hello());
        label = new Label("Label");
        frame.add(label);

        // MenuBar
        MenuBar menuBar = new MenuBar();
        frame.setMenuBar(menuBar);

        // CheckboxMenuItem
        Menu menuCheck = new Menu("Check");
        menuBar.add(menuCheck);
        CheckboxMenuItem checkboxMenu = new CheckboxMenuItem("Check");
        menuCheck.add(checkboxMenu);
        checkboxMenu.addItemListener(new Hello());

        frame.show();
        
    }
    public void windowClosing  (WindowEvent e) {System.exit(0);}
    public void itemStateChanged(ItemEvent e) {
        if (((CheckboxMenuItem)e.getSource()).getState()) {
            label.setText("Checked");
        } else {
            label.setText("Unchecked");
        }
    }
}
    

コード説明

  1. CheckboxMenuItem checkboxMenu = new CheckboxMenuItem("Check");
    チェックメニューアイテムは new CheckboxMenuItem メソッドで作ります。
  2. checkboxMenu.addItemListener(new Hello());
    チェックメニューアイテムのイベントリスナーは、チェックメニューアイテム自身に設定します。
  3. public void itemStateChanged(ItemEvent e) {
    ItemLister インターフェースで実装しなければいけないメソッドは itemStateChanged だけです。
  4. if (((CheckboxMenuItem)e.getSource()).getState()) {
    getSource メソッドで得た値を CheckboxMenuItem にキャストした値に getState メソッドを呼び出すと、チェックメニューがチェックされているかどうかわかります。チェックされていれば true が返されます。

実行結果


Check メニューがチェックされていればラベルに Checked と表示され、チェックされていなければ Unchecked と表示されます。

Sub Menu

Menu を、Menu に追加してサブメニューを作ることもできます。

Hello.java


import java.awt.*;
import java.awt.event.*;

class Hello extends WindowAdapter implements ActionListener {
    static Label label;
    public static void main(String[] args) {
        Frame frame = new Frame("CheckboxMenuItem");
        frame.setSize(200, 100);
        label = new Label("Label");
        frame.add(label);

        // MenuBar
        MenuBar menuBar = new MenuBar();
        frame.setMenuBar(menuBar);

        // Graphics Menu
        Menu menuGraphics = new Menu("Graphics");
        menuBar.add(menuGraphics);
        Menu menuShape   = new Menu("Shape");
        Menu menuColor   = new Menu("Color");
        menuGraphics.add(menuShape);
        menuGraphics.add(menuColor);
        MenuItem menuCircle    = new MenuItem("Circle");
        MenuItem menuRectangle = new MenuItem("Rectangle");
        MenuItem menuTriangle  = new MenuItem("Triangle");
        MenuItem menuRed       = new MenuItem("Red");
        MenuItem menuGreen     = new MenuItem("Green");
        MenuItem menuBlue      = new MenuItem("Blue");
        menuShape.add(menuCircle);
        menuShape.add(menuRectangle);
        menuShape.add(menuTriangle);
        menuColor.add(menuRed);
        menuColor.add(menuGreen);
        menuColor.add(menuBlue);
        menuGraphics.addSeparator();
        menuGraphics.add(new MenuItem("Erase"));
        
        // EventListener
        Hello hello = new Hello();
        frame       .addWindowListener(hello);
        menuShape   .addActionListener(hello);
        menuColor   .addActionListener(hello);
        menuGraphics.addActionListener(hello);

        frame.show();
        
    }
    public void windowClosing  (WindowEvent e) {System.exit(0);}
    public void actionPerformed(ActionEvent e) {
        label.setText(e.getActionCommand());
    }
}
    

実行結果


2651 visits
Posted: Jun. 30, 2020
Update: Jun. 30, 2020

ホーム   目次