2012-08-01 54 views
2

假設有作爲我如何消耗斯卡拉反應

this.reactions += { 
    case KeyReleased(src, key, mod, _) => { 
    // do some stuff 
    // but how to consume this KeyEvent?? 
    } 
} 

doint後「一些東西」我想佔用該KeyEvent一個「反應」塊這樣的關鍵事件,但我不知道怎麼辦。展望上Component.scala來源我已經找到了如何在構造的keyReleased事件:

object keys extends Publisher { 
    peer.addKeyListener(new KeyListener { 
    def keyPressed(e: java.awt.event.KeyEvent) { publish(new KeyPressed(e)) } 
    def keyReleased(e: java.awt.event.KeyEvent) { publish(new KeyReleased(e)) } 
    def keyTyped(e: java.awt.event.KeyEvent) { publish(new KeyTyped(e)) } 
    }) 
} 

的java.awt.event.KeyEvent中被用作構造函數的參數,但調用keyReleased 案例類有這個簽名

case class KeyReleased(val source: Component, key: Key.Value, val modifiers: Key.Modifiers, 
       location: Key.Location.Value) 
       (val peer: java.awt.event.KeyEvent) extends KeyEvent { 
def this(e: java.awt.event.KeyEvent) = 
this(UIElement.cachedWrapper[Component](e.getSource.asInstanceOf[JComponent]), 
    Key(e.getKeyCode), e.getModifiersEx, Key.Location(e.getKeyLocation))(e) 
} 

因此我無法訪問KeyEvent參數。

回答

4

您不必在case語句反應中解開KeyReleased事件。只需匹配事件本身就可以讓你調用消耗。

reactions += { 
    case e: KeyReleased => { 
     println(e.source, e.key, e.modifiers) 
     e.consume 
    } 
} 
+0

這正是我需要的!你的回答非常有用,謝謝! – user1569711 2012-08-02 13:42:16