2012-03-22 71 views
3

我已經得到了所有的教程高達初學者#5翻譯工作,但我不知道Java的足夠好,知道如何港行:翻譯JMonkey教程的JRuby

private ActionListener actionListener = new ActionListener() { 
    public void onAction(String name, boolean keyPressed, float tpf) { 
    if (name.equals("Pause") && !keyPressed) { 
     isRunning = !isRunning; 
    } 
    } 
}; 

private AnalogListener analogListener = new AnalogListener() { 
    public void onAnalog(String name, float value, float tpf) { 
    ... 
    } 
} 

如何可能這項工作?

+0

將這些翻譯的教程公開發布是不是一件好事? :) – 2013-01-11 21:05:10

+0

哦,那可能會有;我只是不知道它甚至在我的電腦上,因爲它已經這麼久了...... – Jwosty 2013-01-15 14:10:42

回答

0

啊,找到答案。原來,他們是匿名的內部類。在JRuby中,你可以創建一個實現Java接口,像這樣一類:

class RBActionListener 
    # This is how you implement Java interfaces from JRuby 
    include com.jme3.input.controls.ActionListener 

    def initialize(&on_action) 
    @on_action = on_action 
    end 

    def onAction(*args) 
    @on_action.call(*args) 
    end 
end 

class HelloJME3 
    # blah blah blah code blah blah blah 

    def register_keys 
    # ... 
    ac = RBActionListener.new {|name, pressed, tpf @running = [email protected] if name == "Pause" and !pressed} 
    input_manager.add_listener(ac, "Pause") 
    end 
end 
1

Calling Java from JRuby所述,您可以使用閉包轉換,其中塊可用於定義Java界面行爲。類似以下內容應該可以工作:

l = lambda { |name, pressed, tpf| running = !running if name == 'Pause' && !pressed } 
input_managers.add_listener(l, ['Left', 'Right', 'Rotate']) 
+0

我仍然無法讓它工作;您的方式引發錯誤'org.jruby.exceptions.RaiseException:(TypeError)無法將類org.jruby.RubyArray的實例轉換爲類java.lang.String'。如果我將它分成單獨的參數或調用'to_java',它不會執行該塊。我不知道什麼是錯的。 – Jwosty 2012-03-22 23:01:00

+0

你有一個SSCCE,我們可以用它來看看有什麼不對嗎? – 2012-03-22 23:13:27

+0

[這裏是](https://gist.github.com/2166358)該文件(它由另一個設置類路徑加載) – Jwosty 2012-03-23 02:51:54

0

我包裹在一個方法的動作偵聽器會返回一個對象,其中包括ActionListener的使用JRuby的:實現了一套方法

def isRunningActionListener 
    return ActionListener.impl do 
    |command, name, keyPressed, tpf| 
     case command 
     when :onAction 
      if name.eql?("Pause") && !keyPressed 
      isRunning = !isRunning; 
      end 
     end 
    end 
end 

你也可以創建自己的ActionListener類,包含的ActionListener ...

class YourActionListener 
    include ActionListener 
    def onAction command, name, keyPressed, tpf 
    #your code here 
    end 
end 

創建自己的類可能是爲很多更好的選擇不詳細,更容易閱讀和理解。