我想在显示或隐藏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
第二部分似乎表明这个"关闭转换"方法应适用于任何接口,但我无法弄清楚是否可以将两种不同的方法分开。
有谁知道如何使用这个"封闭转换"方案分别实现每个特定的接口方法?
答案 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
因为我需要引用一些自由变量,如上所示