如何在jruby中使用闭包转换实现特定的接口方法?

时间:2014-12-06 01:54:21

标签: jruby

我想在显示或隐藏swt菜单时采取不同的操作,因此我要向MenuListener

添加Menu

如果我使用类创建侦听器并通过add_menu_listener添加该类的实例,我可以单独检测显示事件和隐藏事件。例如,使用以下Listener类:

  class MyListener
    include MenuListener

    def menu_shown e
      puts "#{e} was a show event"
    end

    def menu_hidden e
      puts "#{e} was a Hide event"
    end
  end

然后通过

将监听器添加到菜单中
my_menu.add_menu_listener MyListener.new 
当显示菜单与隐藏时,

将打印不同的消息。


我还可以使用"闭包转换添加一个监听器"例如,只要菜单显示为隐藏,就会生成一条消息。

my_menu.add_menu_listener { |e| puts "#{e} was a menu event" } 

jruby wiki的这两个部分似乎涵盖了jruby中的实现接口。

  

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#implementing-java-interfaces-in-jruby   https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#closure-conversion

第二部分似乎表明这个"关闭转换"方法应适用于任何接口,但我无法弄清楚是否可以将两种不同的方法分开。


有谁知道如何使用这个"封闭转换"方案分别实现每个特定的接口方法?

1 个答案:

答案 0 :(得分:0)

仔细观察https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#closure-conversion 我看到这句话:

  

将块转换为Proc对象,然后使用该对象进行修饰   一个java接口代理,用于调用任何方法的块   在界面上调用。

我认为这意味着无法告诉哪种方法称为阻止。

我决定(除非有人有更好的解决方案)是这个

show = "Show"
hide = "Hide"
my_listener = MenuListener.new
my_listener.define_singleton_method(:menu_shown) { |e| puts "#{e} was a #{show} event" }
my_listener.define_singleton_method(:menu_hidden) { |e| puts "#{e} was a #{hide} event" }
my_menu.add_menu_listener my_listener

注意: 我选择了这个

my_listener = MenuListener.new
class << my_listener
   def menu_shown e
       ...
   end
   def menu_hidden e
       ...
   end
end
my_menu.add_menu_listener my_listener

因为我需要引用一些自由变量,如上所示