2010-06-28 19 views
6

ich mit ein bisschen Scala GUI-Programmierung bin experimentieren (mein erstes Projekt in scala, so dass ich dachte, dass ich mit etwas Einfachem beginnen würde). Aber ich habe mich anscheinend in etwas verhakt, das anscheinend relativ trivial sein sollte. Ich habe eine Klasse, die scala.swing.MainFrame erstreckt, und ich möchte erkennen, wenn ein Benutzer eine Taste drückt, wenn das Fenster den Fokus hat. Lustig ist, dass ich anscheinend keinen Weg finden kann, dieses Ereignis in Brand zu setzen.Als Reaktion auf wichtige Ereignisse in scala

Ich fand ein Beispiel dafür, wie jemand anderes das Problem hier gelöst hatte: http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala, aber sie scheinen auf die Verwendung der Java Swing API zurückgekehrt zu sein, was ein wenig enttäuschend ist. Weiß jemand, ob es eine idiomatischere Art gibt, Ereignisse abzufangen?

Antwort

0

Meine Lösung dafür erforderliche mir folgendes zu tun:

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

} 

Dies schien nur wenn zu arbeiten, wenn es keine Schaltfläche Objekte zu diesem Bauteil befestigt waren, oder irgendetwas davon für Kinder.

1

Ich erwarte, dass Sie auf this.keys hören müssen (wobei this das Element der GUI ist, das die Tastaturereignisse empfängt). Siehe die äquivalente Frage zu mouse event.

+0

Thx Daniel, ich brauchte das auch. Die Swing-Dokumentation der Scala ist wirklich schlecht. – Aymen

+0

'this.keys' scheint kein gültiges Attribut' scala.swing.MainFrame' zu ​​sein. Dies gilt auch nicht für "this.Keys", "this.Keyboard" oder "this.keyboard". Gibt es dazu irgendwo Dokumentation? – Ceilingfish

+0

@Ceilingfish Nicht das 'MainFrame', aber ein' Component': Etiketten, Schilder, Textbereiche, usw. Und natürlich, 'this' bezieht sich auf das jeweilige Bauteil. –

3

Zusätzlich zu hören this.keys sollten Sie auch requestFocus auf die Komponente oder setzen Sie fokussierbar = True, wenn es Panel oder abgeleitete Klasse ist.

0

Anstatt auf Java-Ereignisse zurückzufallen, haben alle Komponenten keys, die diese Ereignisse veröffentlicht (also nicht MainFrame). Nicht sicher, was die beste Lösung ist, aber es ist immer möglich, alles in dem Rahmen in einem Component zu wickeln und zu seinem keys zu hören.

6

Dies scheint mit Scala zu arbeiten 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 
     } 
    } 
}  
Verwandte Themen