日期:2014-05-16  浏览次数:20393 次

Java调用JavaScript示例

?

/**   
 * ScriptTest
 *  java调用javascript示例代码
 * @author  your name
 * Date: Nov 4, 2011
 */
package org.sun.script.js;

import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.io.FileReader;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScriptTest
{
    
    public static void main(final String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                String language;
                if (args.length == 0)
                    language = "js";
                else
                    language = args[0];
                
                ScriptEngineManager manager = new ScriptEngineManager();
                System.out.println("Available factories: ");
                for (ScriptEngineFactory factory : manager.getEngineFactories())
                    System.out.println(factory.getEngineName());
                final ScriptEngine engine = manager.getEngineByName(language);
                
                if (engine == null)
                {
                    System.err.println("No engine for " + language);
                    System.exit(1);
                }
                
                ButtonFrame frame = new ButtonFrame();
                
                try
                {
                    // File initFile = new File("init." + language);
                    // if (initFile.exists())
                    // {
                    // System.out.println("exists");
                    // engine.eval(new FileReader(initFile));
                    // }
                    
                    getComponentBindings(frame, engine);
                    
                    final Properties events = new Properties();
                    events.load(new FileReader("bin\\org\\sun\\script\\js\\" + language + ".properties"));
                    for (final Object e : events.keySet())
                    {
                        String[] s = ((String) e).split("\\.");
                        addListener(s[0], s[1], (String) events.get(e), engine);
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setTitle("ScriptTest");
                frame.setVisible(true);
            }
        });
    }
    
    /**
     * Gathers all named components in a container.
     * 
     * @param c the component
     * @param namedComponents
     */
    private static void getComponentBindings(Component c, ScriptEngine engine)
    {
        String name = c.getName();
        if (name != null)
            engine.put(name, c);
        if (c instanceof Container)
        {
            for (Component child : ((Container) c).getComponents())
                getComponentBindings(child, engine);
        }
    }
    
    /**
     * Adds a listener to an object whose listener method executes a script.
     * 
     * @param beanName the name of the bean to which the listener should be
     *            added
     * @param eventName the name of the listener type, such as "action" or
     *            "change"
     * @param scriptCode the script code to be executed
     * @param engine the engine that executes the code
     * @param bindings the bindings for the execution
     */
    private static void addListener(Str