`
lgsun592
  • 浏览: 53603 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java调用JavaScript示例

    博客分类:
  • Java
阅读更多

 

/**   
 * 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(String beanName, String eventName, final String scriptCode,
            final ScriptEngine engine) throws IllegalArgumentException, IntrospectionException, IllegalAccessException,
            InvocationTargetException
    {
        Object bean = engine.get(beanName);
        EventSetDescriptor descriptor = getEventSetDescriptor(bean, eventName);
        if (descriptor == null)
            return;
        descriptor.getAddListenerMethod().invoke(bean,
                Proxy.newProxyInstance(null, new Class[] { descriptor.getListenerType() }, new InvocationHandler()
                {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
                    {
                        engine.eval(scriptCode);
                        return null;
                    }
                }));
        
    }
    
    private static EventSetDescriptor getEventSetDescriptor(Object bean, String eventName)
            throws IntrospectionException
    {
        for (EventSetDescriptor descriptor : Introspector.getBeanInfo(bean.getClass()).getEventSetDescriptors())
            if (descriptor.getName().equals(eventName))
                return descriptor;
        return null;
    }
}

class ButtonFrame extends JFrame
{
    public ButtonFrame()
    {
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        
        panel = new JPanel();
        panel.setName("panel");
        add(panel);
        
        yellowButton = new JButton("Yellow");
        yellowButton.setName("yellowButton");
        blueButton = new JButton("Blue");
        blueButton.setName("blueButton");
        redButton = new JButton("Red");
        redButton.setName("redButton");
        
        panel.add(yellowButton);
        panel.add(blueButton);
        panel.add(redButton);
    }
    
    public static final int DEFAULT_WIDTH = 300;
    public static final int DEFAULT_HEIGHT = 200;
    
    private JPanel panel;
    private JButton yellowButton;
    private JButton blueButton;
    private JButton redButton;
}

 

js.properties
yellowButton.action=panel.background = java.awt.Color.YELLOW
blueButton.action=panel.background = java.awt.Color.BLUE
redButton.action=panel.background = java.awt.Color.RED
0
2
分享到:
评论

相关推荐

    android webview中使用Java调用JavaScript方法并获取返回值

    主要介绍了android webview中使用Java调用JavaScript方法并获取返回值,本文直接给出代码示例,需要的朋友可以参考下

    Java调用JavaScript实现字符串计算器代码示例

    主要介绍了Java调用JavaScript实现字符串计算器代码示例,具有一定参考价值,需要的朋友可以了解下。

    js调用webservice示例+源码

    js原生调用webservice接口,在IE-v11上测试通过,示例中存在参数传入失败的bug,已附源码,望指点解决的方法。

    java-javascript-graalvm:使用GraalVM进行Java和JavaScript代码互操作性的示例项目

    使用GraalVM在Java项目中运行JavaScript 使用GraalVM进行Java和JavaScript代码互操作性的示例项目有关更多信息,如何运行的说明和详细说明,请访问

    Json-RPC for java Example

    json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,...

    java_run_js.rar_run_run java script

    Java执行和调用JavaScript脚本文件的示例,使用Java调用JavaScript文件并输入结果。

    android javascript扩展示例

    android studio 1.0.2工程。javascript调用android中的java方法。

    Android与Vue的交互的方法示例

    JavaScript 调用 Java Android 中 WebView 添加供 Html 页面调用的 Java 方法: mWebView.addJavascriptInterface(new DirectToJS(), AndroidObj); class DirectToJS{ @JavascriptInterface public void ...

    dhtmlx-grid分页-示例,后台java调用

    3 在我的其他资源中也有关于列表和树的组件使用示例: http: download csdn net detail pxzsky 6659071 这个工程是免费的(也可以认为开源) 里面使用了dhtml tree grid 很多地方用了tree 而grid目前只剩下角色管理...

    使用Web页面实现英文词典(Javascript 调用Java方法)

    本示例 将英文词典整合到Web 页中(JavaScript 调用 Java 方法),要实现效果,必须先启动ch06_dictionary_contentprovider 工程

    kettle调用jar包中的方法.txt

    kettle中使用功能java和JavaScript调用jar中的方法示例

    js 动态调用 applet 内的方法示例程序

    本资源是博客《js 动态调用 applet 内的方法》一文示例程序,博客地址:http://blog.csdn.net/defonds/archive/2011/03/23/6270498.aspx。 以下步骤、命令行全都在 jsCallApplet 目录下进行。 步骤一:将 FileApplet...

    java开源包1

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    Android中在WebView里实现Javascript调用Java类的方法

    主要介绍了Android中在WebView里实现Javascript调用Java类的方法,本文直接给出示例,需要的朋友可以参考下

    java源码包---java 源码 大量 实例

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    JAVA上百实例源码以及开源项目源代码

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    Rhino脚本引擎技术介绍

    本文介绍了Rhino脚本引擎,如何在Java中使用脚本引擎调用javascript,以及javascript和java间的交互,并给与示例代码。

    javascript 循环调用示例介绍

    //循环调用,如果已经获取到了结果,则退出循环 loopgetinfo = setInterval(“checksdztsub()”,50); //这里循环调用,间隔50毫秒 } function checksdztsub(){ if ($(“#viewObj_zt_text”).val() !=”” && $(“#...

    JAVA上百实例源码以及开源项目

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    java开源包4

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

Global site tag (gtag.js) - Google Analytics