Pregunta

Estoy experimentando con un poco de programación GUI Scala (mi primer proyecto en Scala, así que pensé que me gustaría empezar con algo sencillo). Pero me parece que han conseguido atascado en algo que parece que debería ser relativamente trivial. Tengo una clase que se extiende scala.swing.MainFrame, y me gustaría para detectar cuando un usuario presiona una tecla cuando esa ventana tiene el foco. Lo curioso es que no parecen ser capaces de encontrar alguna manera de conseguir ese evento al fuego.

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

¿Fue útil?

Solución 4

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 un botón de objetos adjuntos a este componente, o cualquiera de sus hijos.

Otros consejos

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

Además de escuchar a this.keys También debe llamar requestFocus en el componente o conjunto enfocable = true, si se trata de Grupo o clase derivada.

espero que necesita escuchar this.keys (donde this es el elemento de la interfaz gráfica de usuario que recibe los eventos de teclado). Ver la pregunta acerca equivalente .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top