`
soleegn
  • 浏览: 147470 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
阅读更多

    预言了两天,终于决定在我们的RCP客户端中增加执行JRuby的功能。说是预言其实也没有什么好预言的,JRuby早有耳闻,Ruby也一直在学习。其实要解决的问题只有一个---解决Java实例如何给JRuby,然后有JRuby操作,其实不难,JRbuy官方的WIKI上有一个例子,但是那个例子有太多硬编码的问题,稍稍改造,将硬编码的内容抽取到JRuby中,就好了~

    我想说的其实是在RCP中加入JRuby的作用是:

    实施人员只需要写脚本就可以随意操作界面上的任意东西;

    使产品更进一步达到零二次开发的阶段;

    使用JRuby来开发SWT的界面,还是有比较复杂,在熟悉SWT开发和JRuby的情况下画一个比较复杂的界面时候就会非常复杂!这里还是建议使用类似于XSWT等XML界面描述语言,然后配合脚本完成功能。

下面给出一个可以在运行JRuby的SWTShell:

package com.glnpu.jruby;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.jruby.Ruby;
import org.jruby.javasupport.JavaEmbedUtils;
import org.jruby.runtime.builtin.IRubyObject;

public class RunJRUBY extends Shell {

    private RunJRUBY run;
    private Text text;
    /**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
        try {
            Display display = Display.getDefault();
            RunJRUBY shell = new RunJRUBY(display, SWT.SHELL_TRIM);
            shell.open();
            shell.layout();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the shell
     * @param display
     * @param style
     */
    public RunJRUBY(Display display, int style) {
        super(display, style);
        run = this;
        createContents();
    }

    /**
     * Create contents of the window
     */
    protected void createContents() {
        setText("SWT Application");
        setSize(500, 375);

        text = new Text(this, SWT.V_SCROLL | SWT.BORDER | SWT.WRAP | SWT.H_SCROLL);
        text.setBounds(0, 0, 492, 312);

        final Button button = new Button(this, SWT.NONE);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(final SelectionEvent e) {
                Ruby runtime = Ruby.getDefaultInstance();
                try {
                    //允许传对象,作为参数给JRuby
                    IRubyObject rootRubyObject = JavaEmbedUtils.newRuntimeAdapter().eval( runtime, text.getText() );
                    JavaEmbedUtils.invokeMethod( runtime, rootRubyObject, "run", new Object[] {run}, null );
                    //不传对象,直接运行JRbuy
                    //runtime.evalScriptlet(text.getText());
                } catch (Exception e1) {
                    System.err.println(e1.toString());
                    e1.printStackTrace();
                }
            }
        });
        button.setText("button");
        button.setBounds(335, 326, 48, 22);
        //
    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }

}

下面是可以执行的JRuby代码:

require 'java'
module SWTTest
  include_package 'org.eclipse.swt'
  include_package 'org.eclipse.swt.layout'
  include_package 'org.eclipse.swt.widgets'
  include_package 'org.eclipse.swt.events'
end
    class TestDialog < SWTTest::Dialog
      @shell
      @parentShell
      def initialize shell
          super(shell, SWTTest::SWT::NONE)
          @parentShell = shell
          open
      end
      def open
          createContents()
          @shell.open();
          @shell.layout();       
      end
      def createContents
          @shell = SWTTest::Shell.new(@parentShell, SWTTest::SWT::DIALOG_TRIM | SWTTest::SWT::APPLICATION_MODAL)
          @shell.setSize(500, 375);
          @shell.setText("SWT Dialog");
          button = SWTTest::Button.new(@shell, SWTTest::SWT::PUSH)
          button.setText("Test Button 1")    
          button.setBounds(147, 116, 48, 22);
      end
    end
  class TestMain
      def run shell
          TestDialog.new shell
      end
  end
  TestMain.new

在JRuby代码的最下面有一个TestMain的类,主要是用于调用的~这一点是和其他的写法不同的!

至于它有多强大,就看大家怎么用了~而且java和JRuby是运行在同一个JVM之上的,它可以使用此JVM下的所有对象!

分享到:
评论

相关推荐

    hdfs client for ruby (just jruby) hdfs客户端 基于jruby.zip

    标题中的"hdfs client for ruby (just jruby) hdfs客户端 基于jruby.zip"指出,这个压缩包提供了一个专门为JRuby(Java版本的Ruby)设计的HDFS客户端。JRuby允许Ruby代码与Java平台无缝集成,因此这个客户端能够利用...

    jruby1.7.8版本呢

    - **Java 类型映射**:JRuby 自动将 Ruby 类型映射为对应的 Java 类型,例如 Ruby 数组映射为 Java 数组。 **5. 结合 JRuby 实现企业级应用** JRuby 的 Java 集成能力使其在构建企业级应用时具有独特优势。例如,...

    如何安装与配置JRuby

    2. **编写并运行 "Hello World"**: 创建一个名为 `HelloWorld.rb` 的文件,输入 `puts "Hello world"`,然后在 CMD 中运行 `jruby HelloWorld.rb`,你应该能看到 "Hello world" 的输出。 3. **调用 Java 类**: 修改 ...

    使用JRuby开发Web Service全攻略

    本文介绍了如何用JRuby开发Web Service。用JRuby开发Web Service,需要安装ActionWebService。安装完毕之后便可以开始调用及部署了。

    jruby-bin-1.3.1.zip

    这个“jruby-bin-1.3.1.zip”压缩包是JRuby的一个早期版本,专为Ruby语言的研发提供必要的工具和环境。在这个版本中,重点是兼容性、性能和稳定性。 1. JRuby的介绍: JRuby是一种开源的、完全兼容MRI(Matz Ruby ...

    org.jruby.rar

    标题 "org.jruby.rar" 暗示我们正在讨论一个与 JRuby 相关的压缩文件,...开发者可以研究这些文件来理解 JRuby 的内部工作原理、扩展 JRuby 功能或为 JRuby 贡献代码。不过,具体的内容需要解压文件后查看才能得知。

    jruby-src-1.0

    这对于学习如何在Java环境中实现动态语言,或者想要为JRuby贡献代码的人来说是极其宝贵的资源。 此外,标签“eclipse-jruby”暗示了可能有一个Eclipse插件用于支持JRuby的开发。Eclipse是一款流行的开源集成开发...

    Ruby-JRuby一个Ruby语言的Java实现

    为了开始使用JRuby,你需要下载并安装JRuby,配置环境变量,然后可以像使用普通Ruby那样运行Ruby代码。开发过程中,你可以使用像`jirb`(JRuby交互式 shell)这样的工具,或者通过`bundle`管理Gem(Ruby的包管理系统...

    jruby_windows_1_6_4安装文件

    1. **下载**:首先,你需要从官方网站下载“jruby_windows_1_6_4.exe”这个安装文件,确保文件来源安全可靠。 2. **运行安装**:双击exe文件,按照安装向导的提示进行操作。通常,选择默认设置即可满足大部分需求。...

    jruby-1.5.5+OperaWatir+RSpec

    标题 "jruby-1.5.5+OperaWatir+RSpec" 暗示了这是一个关于使用 JRuby 1.5.5 版本、OperaWatir 和 RSpec 进行自动化测试的项目或者资源集合。现在,我们将深入探讨这三个关键组件以及它们在 IT 领域中的应用。 JRuby...

    如何监控JRuby脚本的执行

    本文将详细讲解如何监控JRuby脚本的执行,以及如何使用jprofiler这一强大的性能分析工具。 首先,理解JRuby的工作原理至关重要。JRuby本质上是通过启动JVM来读取和执行Ruby脚本。它既可以解释执行脚本,也可以将...

    j-monkeybars.zip(使用 JRuby 和 Swing 进行跨平台开发的源代码)

    总的来说,这个项目为学习和实践使用JRUBY和Swing进行跨平台开发提供了一个实战案例,对于想要提升Java GUI编程技能,或是对混合Ruby和Java开发感兴趣的开发者来说,这是一个宝贵的资源。通过研究这个压缩包中的代码...

    用JRuby读取Excel文件

    JRuby是Java平台上的一个Ruby实现,它允许开发者使用Ruby语言编写程序,同时利用Java的类库和运行环境。JRuby的出现使得Ruby开发者能够无缝集成Java生态系统,包括大量的开源库和企业级应用。在本例中,JRuby被用来...

    JRuby 实战入门

    **JRuby实战入门** 在IT领域,Ruby是一种高级、动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元...在实践中不断探索,你会发现JRuby为你带来的不仅仅是语言的转换,更是一种全新的开发体验和无限的可能。

    走近JRuby

    通常,博主可能会探讨JRuby如何通过JRUBY-CONF IR(JRuby编译器中间表示)将Ruby代码转换为Java字节码,使得其能够在JVM上高效执行。同时,也可能会讨论JRuby与其他Ruby实现(如Rubinius或TruffleRuby)的对比,以及...

    jruby_windows1.7and bin1.7

    jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合...另一方面,Java平台及其虚拟机、库和 应用服务器的速度、稳定性和功能方面却一直在提升,现在已被公认为是开发高端服务器

    jRuby On Rails WEB2.0

    通过JRuby on Rails,Java开发者可以使用Ruby的简洁语法和Rails的高效开发模式,同时享受Java的成熟技术栈和企业级支持。本书通过一系列实践项目,展示了如何将Rails应用与Java企业应用环境整合,包括如何利用Java ...

    JRuby+Swing是开发人员钟情的选择

    总之,JRuby+Swing 的组合为开发人员提供了丰富的功能和便利性,特别是当使用 Monkeybars 这样的库时,可以有效管理复杂的桌面应用开发。无论是简单的内联调用、DSL 库,还是 MVC 框架,都有其适用场景,开发者可以...

    jruby-bin-0.9.0.tar.gz

    **标题解析:**"jruby-...总之,"jruby-bin-0.9.0.tar.gz"是一个包含早期版本JRUBY的压缩文件,为开发者提供了在Java平台上使用和开发Ruby代码的能力,结合了两种语言的优点,为开发工作带来了更大的灵活性和便利性。

Global site tag (gtag.js) - Google Analytics