Java ショートカットキーを割り当てる方法。

通常アプリケーションのメニューには、ショートカットキーが割り当てられ、マウスを使わずに操作することができるようになっています。キーボードの操作に慣れた人は、マウスを使うより、キーボードで操作したほが作業効率が上がります。

JavaのGUIでは コンポーネントに mnemonic(ニーモック)を割り当てることでショートカットキーが実現できます。


【1】sample217 フォルダをフォルダごとコピーして、sample218 フォルダを作ります。

java-634.gif


【2】今回は以下のようなファイル構成になりますので、コピーした余計なものは削除してください。

java-635.gif

*「SampleDb030.class」ではなく、「SampleDb030.java」を使います。そろそろeclipseに移行しますので、ソースコードのほうを使っておきます。


【3】PrefTest.java を以下のように変更します。SampleDb030.javaの変更はありません。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample218
ファイル名 PrefTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.sql.*;
import java.util.*;

class PrefFrame extends JFrame implements ActionListener, ListSelectionListener {
  Container cp;
  JLabel lb1;
  JList lt;
  JButton btn1, btn2, btn3, btn4;
  JMenuItem mi1, mi2, mi3, mi4, mi5, mi6;
  String[] tkn;

  public PrefFrame(String title) {
    //フレームのタイトル
    setTitle(title);

    //コンテンツペイン取得
    cp = getContentPane();

    //ウィンドウを閉じる時
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        showExitDialog();
      }
    });

    //Look&Feelの設定
/*
    String type = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
    try {
      UIManager.setLookAndFeel(type);
    } catch ( Exception e ) {
      System.out.println("例外発生:" + e );
    }
*/

    //メニューバーの生成
    JMenuBar mb = new JMenuBar();

    //メニューの生成
    JMenu mn1 = new JMenu("ファイル(F)");
    JMenu mn2 = new JMenu("編集(E)");
    JMenu mn3 = new JMenu("検索(S)");

    //ニーモック割り当て
    mn1.setMnemonic(KeyEvent.VK_F);
    mn2.setMnemonic(KeyEvent.VK_E);
    mn3.setMnemonic(KeyEvent.VK_S);

    //メニュー項目の生成
    mi1 = new JMenuItem("追加(I)");
    mi2 = new JMenuItem("更新(U)");
    mi3 = new JMenuItem("削除(D)");
    mi4 = new JMenuItem("終了(X)");
    mi5 = new JMenuItem("検索(R)");
    mi6 = new JMenuItem("全件表示(A)");

    //ニーモック割り当て
    mi1.setMnemonic(KeyEvent.VK_I);
    mi2.setMnemonic(KeyEvent.VK_U);
    mi3.setMnemonic(KeyEvent.VK_D);
    mi4.setMnemonic(KeyEvent.VK_X);
    mi5.setMnemonic(KeyEvent.VK_R);
    mi6.setMnemonic(KeyEvent.VK_A);

    //イベントリスナーの登録
    mi1.addActionListener(this);
    mi2.addActionListener(this);
    mi3.addActionListener(this);
    mi4.addActionListener(this);
    mi5.addActionListener(this);
    mi6.addActionListener(this);

    //メニューへの追加
    mn1.addSeparator(); //セパレーター
    mn1.add(mi4);

    mn2.add(mi1);
    mn2.add(mi2);
    mn2.add(mi3);

    mn3.add(mi5);
    mn3.add(mi6);

    //メニューバーへの追加
    mb.add(mn1);
    mb.add(mn2);
    mb.add(mn3);

    //メニューバーをフレームへ追加
    setJMenuBar(mb);


    //ラベル
    lb1 = new JLabel();
    lb1.setHorizontalAlignment(SwingConstants.CENTER);
    lb1.setOpaque(true);
    lb1.setFont(new Font("Dialog", Font.PLAIN, 12));
    lb1.setBackground(Color.WHITE);
    cp.add(lb1, BorderLayout.NORTH);

    //リスト
    lt = new JList();
    lt.setFont(new Font("Dialog", Font.PLAIN, 14));
    lt.setForeground(new Color(64, 64, 64));
    lt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    lt.addListSelectionListener(this);

    JScrollPane sp = new JScrollPane(lt);
    cp.add(sp, BorderLayout.CENTER);

    //パネル
    JPanel pn1 = new JPanel();
    pn1.setLayout(new GridLayout(1, 4));

    //ボタンの設定
    btn1 = new JButton("追加");
    btn2 = new JButton("更新");
    btn3 = new JButton("削除");
    btn4 = new JButton("終了");

    btn4.setForeground(new Color(255, 0, 0));

    btn1.addActionListener(this);
    btn2.addActionListener(this);
    btn3.addActionListener(this);
    btn4.addActionListener(this);

    pn1.add(btn1);
    pn1.add(btn2);
    pn1.add(btn3);
    pn1.add(btn4);

    //パネルを追加
    cp.add(pn1, BorderLayout.SOUTH);

    //データ表示
    prefAll();
  }

  public void actionPerformed (ActionEvent e) {
    Object obj = e.getSource();
    if (obj == btn1 || obj == mi1) {
      prefInsert();
    }else if (obj == btn2 || obj == mi2) {
      prefUpdate();
    }else if (obj == btn3 || obj == mi3) {
      prefDelete();
    }else if (obj == btn4 || obj == mi4) {
      showExitDialog();
    }else if (obj == mi5) {
      prefSearch();
    }else if (obj == mi6) {
      prefAll();
    }
  }

  public void valueChanged (ListSelectionEvent e) {
    try {
      String str = (String)lt.getSelectedValue();
      if(str != null){
        StringTokenizer st = new StringTokenizer(str, ",");
        int arraySize = st.countTokens();
        tkn = new String[arraySize];
        int i = 0;

        while(st.hasMoreTokens()) {
          tkn[i] = st.nextToken();
          i++;
        }

        lb1.setText("PREF_CD:" + tkn[0] + " PREF_NAME:" + tkn[1]);
        lb1.setForeground(Color.BLUE);
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    }

  }

  private void prefDisplay (ResultSet rs) {
    tkn = null;
    ArrayList<String> listData = new ArrayList<String>();
    try {
      //結果セットからデータを取り出す next()で次の行に移動
      int count = 0;
      while(rs.next()) {
        int prefCd = rs.getInt("PREF_CD");
        String prefName = rs.getString("PREF_NAME");
        listData.add(prefCd + "," + prefName);
        count++;
      }

      lt.setListData(listData.toArray());
      lb1.setForeground(Color.BLUE);

      if(count == 0) {
        lb1.setText("該当するレコードがありません。");
      }else{
        lb1.setText(count + "件表示しました。");
      }

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void showExitDialog () {
    //終了ダイアログボックスの表示
    int ret = JOptionPane.showConfirmDialog (cp, "プログラムを終了しますか?", "確認", JOptionPane.YES_NO_OPTION);

    if(ret == JOptionPane.YES_OPTION) {
      System.exit(0);
    }
  }

  private void prefInsert () {
    //追加
    SampleDb030 db = new SampleDb030();
    String message = "PREF_CD を入力してください。";
    String title = "追加";
    try {

      String prefCd = JOptionPane.showInputDialog (cp, message, title,JOptionPane.QUESTION_MESSAGE);

      if(prefCd != null && !prefCd.equals("")) {
        String message2 = "PREF_NAME を入力してください。";
        String prefName = JOptionPane.showInputDialog (cp, message2, title,JOptionPane.QUESTION_MESSAGE);

        if(prefName != null && !prefName.equals("")) {
          String mySql = "insert into T01Prefecture values(" + prefCd + ", '" + prefName + "')";
          System.out.println(mySql);

          db.open();
          int num = db.executeUpdate(mySql);
          prefAll();
          lb1.setText("登録しました。");
        }
      }
    } catch (BadSqlException e) {
      lb1.setText("登録できませんでした。");
      lb1.setForeground(Color.RED);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      db.close();
    }
  }

  private void prefUpdate () {
    //更新
    SampleDb030 db = new SampleDb030();
    String prefCd = (tkn != null) ? tkn[0] : null;
    String prefName = (tkn != null) ? tkn[1] : null;
    Object nameObj = null;

    try {
      if(prefCd != null) {
        String message = "「" + prefCd + " " + prefName + "」の\n新しい PREF_NAME を入力してください。";
        String title = "更新";
        nameObj = JOptionPane.showInputDialog (cp, message, title,JOptionPane.QUESTION_MESSAGE, null, null, prefName);
      }else{
        JOptionPane.showMessageDialog(cp, "先に都道府県を選択してください。");
      }

      if(nameObj != null) {
        prefName = (String)nameObj;
        String mySql = "update T01Prefecture set PREF_NAME = '" + prefName + "' where PREF_CD = " + prefCd;
        System.out.println(mySql);

        db.open();
        int num = db.executeUpdate(mySql);
        prefAll();
        lb1.setText(num + "件更新しました。");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      db.close();
    }
  }

  private void prefDelete () {
    //削除
    SampleDb030 db = new SampleDb030();
    String prefCd = (tkn != null) ? tkn[0] : null;
    String prefName = (tkn != null) ? tkn[1] : null;
    int ret = -9;

    try {
      if(prefCd != null) {
        String message = "「" + prefCd + " " + prefName + "」を削除しますか?";
        String title = "削除";
        ret = JOptionPane.showConfirmDialog (cp, message, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
      }else{
        JOptionPane.showMessageDialog(cp, "先に都道府県を選択してください。");
      }

      if(ret == JOptionPane.OK_OPTION) {
        String mySql = "delete from T01Prefecture where PREF_CD = " + prefCd;
        System.out.println(mySql);

        db.open();
        int num = db.executeUpdate(mySql);
        prefAll();
        lb1.setText(num + "件削除しました。");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      db.close();
    }

  }

  private void prefSearch () {
    //検索
    SampleDb030 db = new SampleDb030();
    String message = "PREF_NAME の一部を入力してください。";
    String title = "検索";
    try {
      String prefName = JOptionPane.showInputDialog (cp, message, title, JOptionPane.QUESTION_MESSAGE);

      if(prefName != null && !prefName.equals("")) {
        String mySql = "select * from T01Prefecture where PREF_NAME like '%" + prefName + "%'";
        System.out.println(mySql);

        db.open();
        ResultSet rs = db.executeQuery(mySql);
        prefDisplay(rs);
      }

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      db.close();
    }

  }

  private void prefAll () {
    //全件表示

    //SampleDb030をインスタンス化
    SampleDb030 db = new SampleDb030();

    try {
        String mySql = "select * from T01Prefecture order by PREF_CD";
        System.out.println(mySql);

        //データベースに接続
        db.open();
        //検索するSQL実行
        ResultSet rs = db.executeQuery(mySql);
        //データ表示
        prefDisplay(rs);

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      //オブジェクトを解放
      db.close();
    }

  }

}


public class PrefTest {

  public static void main(String args[]) {
    PrefFrame frm = new PrefFrame("都道府県マスター");
    //フレームの設定
    frm.setLocation(300, 200);
    frm.setSize(250, 350);
    frm.cp.setBackground(Color.LIGHT_GRAY);
    frm.setVisible(true);
  }

}



【4】以下の図を参考に、コマンドプロンプトを起動、カレントディレクトリの切り替え、コンパイル、プログラムの実行を行います。

java-636.gif


【5】都道府県マスターが表示されました。メニューにはショートカットキーが表示されています。

java-637.gif


【6】Windowsの場合は、キーボードから「Altキー」を押しながら「Eキー」を押すと、メニュー項目が表示されます。

java-638.gif


【7】「Iキー」を押すと、追加のプログラムが実行されます。マウスでクリックしたときと同じ効果があります。

java-639.gif


【8】他のショートカットキーの動作も試してみてください。


【解説】

ニーモックを割り当てるのは簡単です。

(1)メニューやメニュー項目のテキストに半角英数で (F) のように書くと、プログラムを実行したときに、その部分が自動的に下線で表示されます。

JMenu mn1 = new JMenu("ファイル(F)");
mi1 = new JMenuItem("追加(I)");


(2)あとはsetMnemonic()メソッドの引数に、java.awt.event.KeyEventクラスの定数を指定するだけです。

mn1.setMnemonic(KeyEvent.VK_F);
mi1.setMnemonic(KeyEvent.VK_I);

・VK_0 ~ VK_9 は「0」~「9」に相当。
・VK_A ~ VK_Z は「A」~「Z」に相当。
・VK_F1 ~ VK_F24 は 「F1」~「F24」ファンクションキーに相当。

他にもいろいろありますので詳しくは、JavaのAPI仕様で、 java.awt.event パッケージの KeyEvent クラスをご覧ください。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ