2010-06-28 11 views
6

Estoy experimentando con un poco de programación de Scala gui (mi primer proyecto en scala, así que pensé que comenzaría con algo simple). Pero parece que me he quedado atrapado en algo que parece que debería ser relativamente trivial. Tengo una clase que amplía scala.swing.MainFrame, y me gustaría detectar cuando un usuario presiona una tecla cuando esa ventana tiene foco. Lo curioso es que parece que no puedo encontrar ninguna forma de disparar ese evento.Respondiendo a eventos clave en scala

Encontré un ejemplo de cómo alguien más había solucionado el problema aquí: http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala pero parece que han vuelto a utilizar la API Java Swing, lo cual es un poco decepcionante. ¿Alguien sabe si hay una forma más idiomática de interceptar eventos?

Respuesta

0

Mi solución para esto me obligó a hacer lo siguiente:

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

} 

Esto sólo parecía funcionar aunque si no hubiera objetos de botones agregados a este componente, o cualquiera de sus hijos.

1

Espero que necesite escuchar this.keys (donde this es el elemento de la GUI que recibe los eventos del teclado). Consulte la pregunta equivalente sobre mouse event.

+0

Thx Daniel, necesitaba esto también. La documentación del swing de la scala es realmente pobre. – Aymen

+0

'this.keys' no parece ser un atributo válido de' scala.swing.MainFrame'. Tampoco 'this.Keys',' this.Keyboard' o 'this.keyboard'. ¿Hay alguna documentación sobre esto en cualquier lugar? – Ceilingfish

+0

@Ceilingfish No es el 'MainFrame', sino un' Component': etiquetas, paneles, áreas de texto, etc. Y, por supuesto, 'this' se refiere al componente en sí. –

3

Además de escuchar this.keys, también debe llamar a requestFocus en el componente o establecer focusable = true, si es Panel o clase derivada.

0

En lugar de volver a los eventos java, todos los componentes tienen keys que publica estos eventos (por lo que MainFrame no). No estoy seguro de cuál es la mejor solución, pero siempre es posible incluir todo en el marco dentro de un Component y escuchar su keys.

6

Esto parece funcionar con 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 
     } 
    } 
}  
Cuestiones relacionadas