メニュー、タイトルバー、ステータスバー、ツールバーの表示切り替えを、「ショートカットキー」「メニュー」「ツールバー」から行うサンプルです。
■目次
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」でリスナーを追加してあげましょう。
コメント(バグ、間違い、こんな情報が欲しい等ありましたら)
アンケート(このページの情報はお役に立ちましたか?)
最終更新:2022年09月18日 10:17