メニュー、タイトルバー、ステータスバー、ツールバーの表示切り替えを、「ショートカットキー」「メニュー」「ツールバー」から行うサンプルです。

■目次


サンプルソース MenuOnOfSample.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.BevelBorder;
 
/**
 * メニューの表示・非表示サンプル
 * Ctrl + A : メニューの表示切り替え
 * Ctrl + B : タイトルバー
 * Ctrl + C : ステータスバー
 * Ctrl + D : ツールバー
 * ショートカットキーとメニュー、ツールバーからそれぞれ切り替えサンプル
 */
public class MenuOnOfSample extends JFrame {
 
  // メニュー
  JMenuBar menuBar = new JMenuBar();
 
  // ステータスバー
  JPanel statusBar = new JPanel();
 
  // ツールバー
  JToolBar toolBar = new JToolBar();
 
  public static void main(String[] args) {
    new MenuOnOfSample();
  }
 
  public MenuOnOfSample() {
    initUI();
  }
 
  /**
   * ユーザーインターフェース作成
   */
  private void initUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("メニューの表示切り替え");
    setBounds(100, 100, 300, 200);
 
    // メニュー作成
    createMenu();
 
    // ステータスバー作成
    createStatusBar();
 
    // ツールバー作成
    createToolBar();
 
    // ショートカットキーのためにリスナー追加
    addKeyListener(new KeyAdapter() {
      @Override
      public void keyReleased(KeyEvent e) {
        doKeyEvent(e);
      }
    });
 
    // テキストエリア追加
    JTextArea textArea = new JTextArea();
    // テキストエリアにもキーボードイベントを処理するようにリスナーを追加します
    // これを入れないとテキストエリアにフォーカスがある時に、表示切り替えができません
    textArea.addKeyListener(new KeyAdapter() {
      @Override
      public void keyPressed(KeyEvent e) {
        doKeyEvent(e);
      }
    });
    add(textArea, BorderLayout.CENTER);
 
    setVisible(true);
  }
 
  /**
   * ステータスバー作成
   */
  private void createStatusBar() {
    statusBar.setBorder(new BevelBorder(BevelBorder.LOWERED));
    statusBar.setPreferredSize(new Dimension(this.getWidth(), 16));
    statusBar.setLayout(new BoxLayout(statusBar, BoxLayout.X_AXIS));
    JLabel label = new JLabel("status bar");
    statusBar.add(label);
    add(statusBar, BorderLayout.SOUTH);
  }
 
  /**
   * メニュー作成
   */
  private void createMenu() {
    // メニュー作成
    JMenu menu = new JMenu("表示(M)");
    // メニューアイテム作成
    JMenuItem item1 = new JMenuItem("メニューの表示切り替え(A)");
    JMenuItem item2 = new JMenuItem("タイトルバーの表示切り替え(B)");
    JMenuItem item3 = new JMenuItem("ステータスバーの表示切り替え(C)");
    JMenuItem item4 = new JMenuItem("ツールバーの表示切り替え(D)");
 
    // メニューアイテムにアクションリスナー追加
    item1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchMenuBar();
      }
    });
    item2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchTitleBar();
      }
    });
    item3.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchStatusBar();
      }
    });
    item4.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchToolBar();
      }
    });
 
    // メニューにメニューアイテム追加
    menu.add(item1);
    menu.add(item2);
    menu.add(item3);
    menu.add(item4);
 
    // メニューバーにメニューを追加
    menuBar.add(menu);
 
    // フレームにメニューバーを追加
    setJMenuBar(menuBar);
  }
 
  /**
   * ツールバー作成
   */
  public void createToolBar() {
    // ボタン作成
    JButton button1 = new JButton("M");
    JButton button2 = new JButton("Ti");
    JButton button3 = new JButton("S");
    JButton button4 = new JButton("To");
 
    // ボタンにアクションリスナー追加
    button1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchMenuBar();
      }
    });
    button2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchTitleBar();
      }
    });
    button3.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchStatusBar();
      }
    });
    button4.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        switchToolBar();
      }
    });
 
    // ツールチップ設定
    button1.setToolTipText("メニューの表示/非表示を切り替えます。");
    button2.setToolTipText("タイトルバーの表示/非表示を切り替えます。");
    button3.setToolTipText("ステータスバーの表示/非表示を切り替えます。");
    button4.setToolTipText("ツールバーの表示/非表示を切り替えます。");
 
    // ツールバーにボタン追加
    toolBar.add(button1);
    toolBar.add(button2);
    toolBar.add(button3);
    toolBar.add(button4);
 
    // 画面下部にツールバー追加
    add(toolBar, BorderLayout.NORTH);
  }
 
  /**
   * キーイベント
   * 
   * @param e
   */
  public void doKeyEvent(KeyEvent e) {
    if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) > 0) {
      // Ctrl + A 判定
      if (e.getKeyCode() == KeyEvent.VK_A) {
        // メニューバー表示切り替え
        switchMenuBar();
      }
      // Ctrl + B 判定
      if (e.getKeyCode() == KeyEvent.VK_B) {
        // タイトルバー表示切り替え
        switchTitleBar();
      }
      // Ctrl + C 判定
      if (e.getKeyCode() == KeyEvent.VK_C) {
        // ステータスバー表示切り替え
        switchStatusBar();
      }
      // Ctrl + D 判定
      if (e.getKeyCode() == KeyEvent.VK_D) {
        // ツールバー表示切り替え
        switchToolBar();
      }
    }
  }
 
  /**
   * メニューバー表示切り替え
   */
  public void switchMenuBar() {
    menuBar.setVisible(!menuBar.isVisible());
  }
 
  /**
   * ステータスバー表示切り替え
   */
  public void switchStatusBar() {
    statusBar.setVisible(!statusBar.isVisible());
  }
 
  /**
   * タイトルバー表示切り替え
   */
  public void switchTitleBar() {
    dispose();
    setUndecorated(!isUndecorated());
    setVisible(true);
  }
 
  /**
   * ツールバー表示切り替え
   */
  public void switchToolBar() {
    toolBar.setVisible(!toolBar.isVisible());
  }
 
}
 

ポイント解説

メニュー、ステータスバー、ツールバーの表示切り替え

menuBar.setVisible(!menuBar.isVisible());
statusBar.setVisible(!statusBar.isVisible());
toolBar.setVisible(!toolBar.isVisible());
  • 上記のコードは呼び出される度に、表示/非表示を切り替えます。
    • 「isVisible」に!を付けて「setVisible」することで、呼び出す度に簡単に表示/非表示が切り替わるのです。

タイトルバーの表示切り替え

dispose();
setUndecorated(!isUndecorated());
setVisible(true);
  • タイトルバーの表示切り替えには「setUndecorated」を使います。
    • メニューの表示切り替えと同じく、「isUndecorated」に!を付けて切り替えています。
  • 「setUndecorated」はフレームが表示されていない時に呼び出す必要があるので、事前に「dispose」でリソースを破棄します。
    • 「setUndecorated」が終わったら、「setVisible(true)」でフレームを再表示しています。

キーボードショートカット

  • メニューアイテムに「setAccelerator」でショートカットキーを設定することも出来るのですが、この場合メニューを非表示にするとショートカットキーが効かなくなります。
  • 今回のサンプルはメニューの表示切り替えなので、自力でキーボードショートカットを処理しています。
if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) > 0) {
  // Ctrl + A 判定
  if (e.getKeyCode() == KeyEvent.VK_A) {
    // メニューバー表示切り替え
    switchMenuBar();
  }
 
  • 上記のサンプルは、まず「if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) > 0)」でCtrlキーの同時押しを判定しています。
    • Altキーなら「InputEvent.ALT_DOWN_MASK」、Shiftキーなら「InputEvent.SHIFT_DOWN_MASK」で判定できます。
  • 次に「if (e.getKeyCode() == KeyEvent.VK_A)」で「A」が押されているか判定しています。

テキストエリアでショートカットキーを押した時の処理

textArea.addKeyListener(new KeyAdapter() {
  @Override
  public void keyPressed(KeyEvent e) {
    doKeyEvent(e);
  }
});
 
  • JFrameにショートカットキーのリスナーを追加しても、JTextArea等のコンポーネントにフォーカスが行くと、JFrameのリスナーまでイベントが届かず、ショートカットキーを押しても何も起きなくなってしまいます。
  • そんなコンポーネントを追加した時は、それぞれのコンポーネントに「addKeyListener」でリスナーを追加してあげましょう。

コメント(バグ、間違い、こんな情報が欲しい等ありましたら)


アンケート(このページの情報はお役に立ちましたか?)

順位 選択肢 得票数 得票率 投票
1 役に立った 6 (55%)
2 分かりにくい 2 (18%)
3 役に立たない 2 (18%)
4 間違っている 1 (9%)
その他
投票総数 11

タグ:

Java swing
最終更新:2022年09月18日 10:17
添付ファイル