6

私はScalaのGUIプログラミングを少し試しています(scalaでの最初のプロジェクトなので、簡単なものから始めようと思いました)。しかし、私はそれが比較的些細なはずであるように思われる何かで立ち往生しているようです。scala.swing.MainFrameを拡張するクラスがあり、そのウィンドウにフォーカスがあるときにユーザーがキーを押したときを検出したいと思います。面白いことに、そのイベントを発生させる方法を見つけることができないようです。

http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scalaで、他の誰かがこの問題を回避した例を見つけましたが、Javaの使用に戻ったようです。 Swing API、これは少し残念です。イベントを傍受するもっと慣用的な方法があるかどうか誰かが知っていますか?

4

5 に答える 5

6

これはScala2.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
        }
    }
}      
于 2012-08-05T15:08:35.170 に答える
3

聞くことに加えてthis.keys、コンポーネントでrequestFocusを呼び出すか、Panelまたは派生クラスの場合はfocusable=trueを設定する必要があります。

于 2011-10-08T17:56:26.950 に答える
1

聞く必要があると思いますthis.keysthisキーボードイベントを受信するGUIの要素はどこにありますか)。マウスイベントに関する同等の質問を参照してください。

于 2010-06-29T04:40:54.907 に答える
1

これに対する私の解決策では、次のことを行う必要がありました。

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

}

これは、このコンポーネントにボタンオブジェクトがアタッチされていない場合、またはその子である場合にのみ機能するように見えました。

于 2010-06-30T08:46:25.650 に答える
0

keysJavaイベントにフォールバックするのではなく、これらのイベントを公開するすべてのコンポーネントがあります(そうMainFrameではありません)。最善の解決策が何であるかはわかりませんが、フレーム内のすべてをa内でラップし、Componentそのを聞くことは常に可能keysです。

于 2011-10-20T07:01:50.737 に答える