命名規則によってメニューを自動生成

http://d.hatena.ne.jp/alpha_neet/20100930/1285842300


前回のgetMethod,invokeを応用してメニューを自動生成するクラスを作ってみた
記述をより簡易にするためにenumを使用。というかenumすごそう。
追いきれないで途中で使ってるけどもっといろんなことができそうです。


http://cha.sblo.jp/article/32041689.html
http://d.hatena.ne.jp/ashigeru/20090119/1232365391


ここら辺のサイトが参考になりました。感謝です。


命名規則によって自動的に生成しているのでメニューの修飾など本格的なアプリを作るときは少しいじらないと駄目。
でも簡単な個人で使うようなスクラッチツールのときは重宝しそうです。

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.HashMap;
import java.lang.reflect.Method;

/**
 * AutoMenu
 * _で区切って Menu -> MenuItem という形になる
 * createMenuで指定したframeに自動的に追加する
 * shellに指定したクラスにenumと同じ名前のメソッドがあれば
 * そのメソッドを実行する。
 */
enum AutoMenu {
  file_open,
  file_save,
  file_quit,

  filter_all,
  filter_moke,
  filter_hoge,

  help_ver,
  help_help,
  ;

  private static JFrame frame;
  private static Object shell;
  /**
   * 文字の先頭を大文字に
   */
  private static String toUpper(String str) {
    return str.substring(0,1).toUpperCase()+str.substring(1);
  }
  /**
   * メニュー生成
   */
  public static void createMenu(JFrame _frame, Object _shell) {
    frame = _frame;
    shell = _shell;
    HashMap<String, Object> listMap=new HashMap<String, Object>();

    JMenuBar mb = new JMenuBar();
    for(AutoMenu m: AutoMenu.values()) {
      String[] name = m.toString().split("_");
      int length = name.length;
      Object ret;
      
      // ActionListener生成
      // shellにコマンド名のメソッドがあれば投げる
      ActionListener listener = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          Class<?> clazz = shell.getClass();
          Method method = clazz.getMethod(e.getActionCommand());
          method.invoke(shell);
        } catch(Exception ex) { }
      }};
      
      // JMenu生成
      String menuName = name[0];
      ret = listMap.get(menuName);
      if(ret == null) {
        JMenu menu = new JMenu(toUpper(menuName));
        menu.addActionListener(listener);
        menu.setActionCommand(menuName);
        listMap.put(menuName, menu);
        mb.add(menu);
      }
      if(length<2) continue;

      // JMenuItem生成
      String menuItemName = name[0] + "_" + name[1];
      ret = listMap.get(menuItemName);
      if(ret == null) {
        JMenuItem menuItem = new JMenuItem(toUpper(name[1]));
        menuItem.addActionListener(listener);
        menuItem.setActionCommand(menuItemName);
        listMap.put(menuItemName, menuItem);

        JMenu menu = (JMenu)listMap.get(menuName);
        menu.add(menuItem);
      }
    }

    frame.setJMenuBar(mb);
  }
}

class AutoMenuTest {
/**
 * final field
 */
final String CLASSNAME;
final Shell $sh;

/**
 * Shell
 */
class Shell {
  public void file_open() { System.out.println("file_open"); }
  public void file_save() { System.out.println("file_save"); }
  public void filter_all() { System.out.println("filter_all"); }
}

/**
 * MainFrame
 */
class MainFrame extends JFrame {
  /**
   * initialize
   */
  MainFrame() {
    AutoMenu.createMenu(this, $sh);

    // window setting
    setTitle(CLASSNAME);
    setSize(400, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }
}

/**
 * main
 */
public AutoMenuTest() {
  $sh = new Shell();
  CLASSNAME = this.getClass().getName();
  new MainFrame();
}
public static void main(String[] args) {
  new AutoMenuTest();
}}