2010-06-28 30 views
6

我正在嘗試一些Scala gui編程(我在scala中的第一個項目,所以我想我會從簡單的事情開始)。但我似乎陷入了一些似乎應該相對微不足道的事情。我有一個擴展scala.swing.MainFrame的類,並且我想在用戶按下某個鍵時關注該窗口。有趣的是,我似乎無法找到任何方式讓事件發生。響應scala中的重要事件

我找到了一個其他人如何解決這個問題的例子:http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala但他們似乎已經恢復使用Java Swing API,這有點令人失望。有沒有人知道是否有更常用的攔截事件的方式?

回答

0

我的這種解決方案需要我做到以下幾點:

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") 
    } 
}) 

} 

這似乎只是工作,雖然如果有連接到該組件沒有按鈕的對象,或任何它的孩子。

1

我希望你需要聽取this.keys(其中this是GUI接收鍵盤事件的元素)。請參閱關於mouse event的等效問題。

+0

THX丹尼爾的工作,我需要這一點。 Scala的swing文檔非常差。 – Aymen 2010-06-29 04:47:32

+0

'this.keys'似乎不是'scala.swing.MainFrame'的有效屬性。 「this.Keys」,「this.Keyboard」或「this.keyboard」也不是。這個地方有任何文件嗎? – Ceilingfish 2010-06-29 08:57:26

+0

@Ceilingfish不是'MainFrame',而是'Component':標籤,面板,文本區域等。當然,'this'指的是組件本身。 – 2010-06-29 13:42:00

3

除了偵聽this.keys,您還應該在組件上調用requestFocus或設置focusable = true(如果它是Panel或派生類)。

0

而不是回落到java事件,所有組件都有keys發佈這些事件(因此MainFrame不)。不知道最好的解決方案是什麼,但它總是可以包裝在Component框架內的一切,並聽取它的keys

6

這似乎與斯卡拉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 
     } 
    } 
}