2014-12-06 53 views
0

我想採取不同的行動時,顯示或隱藏一個SWT菜單,所以我使用的是類中添加一個MenuListenerMenu如何在jruby中使用閉包轉換實現特定的接口方法?

如果我創建的偵聽器,並通過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 

聽者添加到菜單將打印不同的信息時,將顯示VS隱藏菜單。


我還可以使用「封閉的轉換」,例如,這將產生一個消息每當菜單顯示隱藏添加偵聽器。

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

尋找更接近地在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 

,因爲我需要引用一些自由變量如上圖所示

相關問題