Java Swing Menu Item makeMenuItem(String label, final Object object, final String methodName)

Here you can find the source of makeMenuItem(String label, final Object object, final String methodName)

Description

Make a jmenuItem.

License

Open Source License

Parameter

Parameter Description
label Label
object Object to call
methodName Method name to call

Return

The menuItem

Declaration

public static JMenuItem makeMenuItem(String label, final Object object, final String methodName) 

Method Source Code

//package com.java2s;
/*/*w  w w  .j av a2  s.c  om*/
 * $Id: GuiUtils.java,v 1.317 2007/08/10 14:26:33 jeffmc Exp $
 *
 * Copyright  1997-2016 Unidata Program Center/University Corporation for
 * Atmospheric Research, P.O. Box 3000, Boulder, CO 80307,
 * support@unidata.ucar.edu.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at
 * your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
 * General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

import java.awt.event.*;

import java.lang.reflect.*;
import java.util.ArrayList;

import javax.swing.*;

public class Main {
    /**
     * Make a jmenuItem. Call methodName on object when menuItem pressed. Pass in given arg
     * if non-null.
     *
     * @param label Label
     * @param object Object to call
     * @param methodName Method name to call
     * @param arg Pass this to method name if non-null.
     *
     * @return The menuItem
     */
    public static JMenuItem makeMenuItem(String label, final Object object, final String methodName,
            final Object arg) {
        return makeMenuItem(label, object, methodName, arg, false);
    }

    /**
     * Make a jmenuItem. Call methodName on object when menuItem pressed.
     *
     * @param label Label
     * @param object Object to call
     * @param methodName Method name to call
     *
     * @return The menuItem
     */
    public static JMenuItem makeMenuItem(String label, final Object object, final String methodName) {
        return makeMenuItem(label, object, methodName, null, false);
    }

    /**
     * Make a jmenuItem. Call methodName on object when menuItem pressed. Pass in given arg
     * if non-null.
     *
     * @param label Label
     * @param object Object to call
     * @param methodName Method name to call
     * @param arg Pass this to method name if non-null.
     * @param inThread If true then call the method in a thread
     *
     * @return The menuItem
     */
    public static JMenuItem makeMenuItem(String label, final Object object, final String methodName,
            final Object arg, final boolean inThread) {
        final Method theMethod = findMethod(object, methodName, arg);
        final JMenuItem mi = new JMenuItem(label);
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (inThread) {
                    Thread t = new Thread() {
                        public void run() {
                            invokeMethod();
                        }
                    };
                    t.start();
                } else {
                    invokeMethod();
                }
            }

            public void invokeMethod() {
                try {
                    if (arg == null) {
                        theMethod.invoke(object, new Object[] {});
                    } else {
                        theMethod.invoke(object, new Object[] { arg });
                    }
                } catch (Exception exc) {
                    //                    LogUtil.logException("Error in makeMenuItem", exc);
                }
            }
        };
        mi.addActionListener(listener);
        return mi;
    }

    /**
     * Find all methods with the given name.
     * Of these methods find one whose parameter types
     * are assignable from the given parameter types.
     *
     * @param c            class to check
     * @param methodName   name of method
     * @param paramTypes   parameter types
     * @return  class method or <code>null</code> if one doesn't exist
     */
    public static Method findMethod(Class c, String methodName, Class[] paramTypes) {
        ArrayList all = new ArrayList();
        Method[] methods = c.getMethods();
        for (int i = 0; i < methods.length; i++) {
            if (!methodName.equals(methods[i].getName())) {
                continue;
            }
            if (paramTypes == null) {
                return methods[i];
            }
            if (typesMatch(methods[i].getParameterTypes(), paramTypes)) {
                all.add(methods[i]);
            }
        }
        if (all.size() > 1) {
            String msg = "More than one method: " + methodName + " found for class:" + c.getName();
            for (int i = 0; i < paramTypes.length; i++) {
                if (paramTypes[i] != null) {
                    msg += " " + paramTypes[i].getName();
                }
            }
            throw new IllegalArgumentException(msg);
        }
        if (all.size() == 1) {
            return (Method) all.get(0);
        }
        return null;
    }

    /**
     * Find a method
     *
     * @param object     Object with the method in it
     * @param methodName method name
     * @param arg        method argument
     *
     * @return  the method
     */
    private static Method findMethod(Object object, String methodName, Object arg) {

        Method theMethod = null;
        if (arg == null) {
            theMethod = findMethod(object.getClass(), methodName, new Class[] {});
        } else {
            theMethod = findMethod(object.getClass(), methodName, new Class[] { arg.getClass() });
        }
        if (theMethod == null) {
            System.err.println("arg = " + arg);
            throw new IllegalArgumentException("Unknown method:" + object.getClass() + "." + methodName + "("
                    + ((arg == null) ? "" : arg.getClass().getName()) + ")");
        }
        return theMethod;

    }

    /**
     * Returns true if the Classes defined in the actual parameter
     * are equal or a sub-class of the corresponding classes defined in the
     * formal argument.
     *
     * @param formals     formal classes (types)
     * @param actuals     actual classes
     * @return   true  if they match
     */
    public static boolean typesMatch(Class[] formals, Class[] actuals) {
        if (formals.length != actuals.length) {
            return false;
        }
        for (int j = 0; j < formals.length; j++) {
            if (actuals[j] == null) {
                continue;
            }
            if (!formals[j].isAssignableFrom(actuals[j])) {
                return false;
            }
        }
        return true;
    }
}

Related

  1. loadMenuItem(String action)
  2. makeCheckboxMenuItem(String label, final Object object, final String property, final Object arg)
  3. makeMenu(String name, List menuItems)
  4. makeMenuItem(Icon icon, Icon rollover, String menu_cmd, boolean is_toggle, int mnemonic, int accel)
  5. makeMenuItem(Icon icon, Icon rollover, String menu_cmd, boolean is_toggle, int mnemonic, int accel)
  6. makeMenuItem(String s, ActionListener listener)
  7. makeMenuItem(URL iconURL, String text, ActionListener listener)
  8. newMenuItem(String name, KeyStroke keyStroke, final Runnable runnable)
  9. paintMenuItemBackground(Graphics g, Component c)