Отвечая на ключевые события в Scala - PullRequest
6 голосов
/ 29 июня 2010

Я экспериментирую с небольшим количеством программирования на Scala GUI (мой первый проект в Scala, поэтому я решил начать с чего-то более простого). Но я, кажется, застрял в чем-то, что, кажется, должно быть относительно тривиальным. У меня есть класс, который расширяет scala.swing.MainFrame, и я хотел бы определить, когда пользователь нажимает клавишу, когда это окно имеет фокус. Забавно, но мне кажется, что я не могу найти способ запустить это событие.

Я нашел пример того, как кто-то еще справился с этой проблемой: http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala, но они, похоже, вернулись к использованию Java Swing API, что немного разочаровывает. Кто-нибудь знает, есть ли более идиоматический способ перехвата событий?

Ответы [ 5 ]

6 голосов
/ 05 августа 2012

Это похоже на работу с 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
        }
    }
}      
3 голосов
/ 08 октября 2011

В дополнение к прослушиванию this.keys вы должны также вызвать requestFocus для компонента или установить focusable = true, если это Panel или производный класс.

1 голос
/ 29 июня 2010

Полагаю, вам нужно прослушать this.keys (где this - это элемент графического интерфейса, получающий события клавиатуры). См. Аналогичный вопрос о событие мыши .

0 голосов
/ 20 октября 2011

Вместо того, чтобы возвращаться к событиям Java, все компоненты имеют keys, который публикует эти события (поэтому MainFrame нет).Не уверен, что это лучшее решение, но всегда можно обернуть все в кадре внутри Component и прослушать его keys.

0 голосов
/ 30 июня 2010

Мое решение для этого потребовало от меня сделать следующее:

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

}

Казалось бы, это работает, только если к этому компоненту или его дочерним объектам не было прикреплено ни одного объекта кнопки.

...