响应scala中的关键事件

Cei*_*ish 6 swing scala keyevent

我正在尝试一些Scala gui编程(我在Scala中的第一个项目,所以我认为我从简单的开始).但我似乎陷入了一些似乎应该相对微不足道的事情.我有一个扩展scala.swing.MainFrame的类,我想检测用户在该窗口具有焦点时按键的时间.有趣的是,我似乎无法找到任何方式让事件发生.

我找到了一个例子,其他人如何解决这个问题:http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala但是他们似乎已经恢复使用Java了Swing API,这有点令人失望.有谁知道是否有更惯用的截取事件的方式?

Mik*_*rju 6

这似乎适用于Scala 2.9

package fi.harjum.swing

import scala.swing._
import scala.swing.event._
import java.awt.event._

object KeyEventTest extends SimpleSwingApplication {
    def top = new MainFrame {
        val label = new Label {
            text = "No click yet"
        }
        contents = new BoxPanel(Orientation.Vertical) {
            contents += label
            border = Swing.EmptyBorder(30,30,10,10)
            listenTo(keys)
            reactions += {
                case KeyPressed(_, Key.Space, _, _) =>
                    label.text = "Space is down"
                case KeyReleased(_, Key.Space, _, _) =>
                    label.text = "Space is up"
            }
            focusable = true
            requestFocus
        }
    }
}      
Run Code Online (Sandbox Code Playgroud)


Cei*_*ish 1

我的解决方案要求我执行以下操作:

class MyFrame extends MainFrame {

this.peer.addKeyListener(new KeyListener() {
    def keyPressed(e:KeyEvent) {
      println("key pressed")
    }

    def keyReleased(e:KeyEvent) {
      println("key released")
    }

def keyTyped(e:KeyEvent) {
      println("key typed")
    }
 })

}
Run Code Online (Sandbox Code Playgroud)

这似乎只有在没有按钮对象附加到该组件或其任何子组件时才有效。