4

シーソーでJavaフレームを作成しました

(def f (frame :title "my app"))

そして、ユーザーのキー押下をキャッチしたいと思います。

私はあちこちでコードを集めようとしました、そしてこれで終わりました

(ns myapp.core
  (:use seesaw.core)
  (:use seesaw.font)
  (:import [java.awt.event ActionListener KeyListener KeyEvent])
)

(defn input-listener []
(proxy [ActionListener KeyListener] []
  (actionPerformed [e])
  (keyPressed [e] (alert e "You pressed a key!"))
  (keyReleased [e])
  (keyTyped [e])))

(doto f
  (.addKeyListener (input-listener)))

しかし、それはまったく機能しません。私はclojureを初めて使用しますが、JAVAについてはまったく知らないので(そして、実際にJavaにアクセスしたくないので)、少し迷っています。アプリ全体でキーボードショートカットのユーザー入力をキャッチする簡単な方法はありますか?

助けてください。

4

4 に答える 4

4

特定のキー押下をフレーム内のさまざまな機能にマップしたい場合は、おそらくseesaw.keymap/map-keyが必要です。

; When 'e' is pressed in frame f, call this function
(map-key f "e" (fn [_] (... do something ))

(これはすべて @Bill 参照のキーバインディングの上に構築されています)

詳細については、ドキュメントを参照しmap-keyてください。他の回答が暗示しているように、Swing でのキーボード処理は他の Swing よりも厄介なので、多少の痛みに備えてください :)

于 2012-11-15T05:41:32.423 に答える
3

スイングアプリケーションでキーをグローバルにインターセプトする場合は、が必要です。KeyEventDispatcherこれは、を介して登録しますKeyboardFocusManager。キーに基づくアクションを特定のコンポーネントに追加する場合(はるかに高いレベル-はるかに優れている)、KeyBindingshttp://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.htmlが必要になる可能性があります

ただし、シーソーを学ぶ前に、少しスイングを理解する必要があります。JavaTrailは開始するのに適した場所です。http://docs.oracle.com/javase/tutorial/uiswing/index.html

于 2012-11-14T15:35:12.777 に答える
3

Seesaw は優れていますが、特に (私のように) Swing の専門家でない場合は、やりたいことを実行する方法を見つけるのが少し難しいかもしれません。通常、Java API に侵入する必要はありません。これほど単純なものの場合は特にそうです。これが私のために働いたものです:

(ns so.core
  (:use seesaw.core))

(let [f (frame :title "my app")
      handler (fn [e] (alert "pressed key!"))]
  (listen f :key-pressed handler)
  (show! f))

残念ながら、この素敵な Seesaw チュートリアルには、キーを押す例がありません。追加するとよいでしょう。

于 2012-11-14T14:51:00.980 に答える
0

アラートの呼び出しで e を受け取りましたが、実際にはそこに属していません。それなしで動作するはずです。Javaを学ばずにClojureを使おうとして頑張ってください。長期的にはうまくいくとは思いませんが、うまくいくといいですね。

于 2012-11-14T09:45:37.287 に答える