当显示或隐藏swt菜单时,我希望采取不同的操作,因此我将向MenuListener添加一个菜单。
如果使用类创建侦听器并通过add_menu_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的这两部分似乎涵盖了jruby中的实现接口。
https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#implementing-java-interfaces-in-jruby https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#closure-conversion
第二节似乎指出,这个“闭包转换”方法应该适用于任何接口,但我想不出如何让它分离出这两个不同的方法。
有人知道如何使用这种“闭包转换”方案分别实现每个特定的接口方法吗?
发布于 2014-12-05 21:06:29
更仔细地看一看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
因为我需要引用一些自由变量,如上面所示
https://stackoverflow.com/questions/27327438
复制