6

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

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

4

5 回答 5

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
        }
    }
}      
于 2012-08-05T15:08:35.170 回答
3

除了听this.keys你还应该在组件上调用 requestFocus 或设置 focusable=true,如果它是 Panel 或派生类。

于 2011-10-08T17:56:26.950 回答
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")
    }
 })

}

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

于 2010-06-30T08:46:25.650 回答
1

我希望您需要听听this.keys(接收键盘事件的 GUI 元素在哪里this)。请参阅有关鼠标事件的等效问题。

于 2010-06-29T04:40:54.907 回答
0

keys所有组件都没有发布这些事件(所以MainFrame没有) ,而不是回退到 java 事件。不确定最好的解决方案是什么,但总是可以将框架中的所有内容包装在 a 中Component并收听它的keys.

于 2011-10-20T07:01:50.737 回答