2010-06-28 4 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 - это элемент графического интерфейса пользователя, который принимает события клавиатуры). См. Эквивалентный вопрос о mouse event.

+0

Thx Daniel, я нуждался в этом тоже. Документация качания Scala действительно бедна. – Aymen

+0

'this.keys', похоже, не является допустимым атрибутом' scala.swing.MainFrame'. Также не выполняется «this.Keys», 'this.Keyboard' или' this.keyboard'. Есть ли какие-либо документы по этому поводу? – Ceilingfish

+0

@Ceilingfish Не 'MainFrame', а' Компонент': метки, панели, текстовые области и т. Д. И, конечно же, 'this' относится к самому компоненту. –

3

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

0

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

6

Это похоже на работу с 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 
     } 
    } 
}  
Смежные вопросы