2012-11-14 90 views
4

等待一個按鍵我創建與蹺蹺板Clojure中

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

一個Java幀,我想捕捉用戶按鍵。

我想在這裏和那裏收集代碼以及與此

(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(和真的不希望丁俊暉進去)我有點失落。 有沒有簡單的方法來捕捉整個應用程序中的鍵盤快捷鍵的用戶輸入?

請幫忙。

+0

蹺蹺板很不錯,但它基本上是Java Swing的一個包裝。在不瞭解Java和Swing的情況下使用它可能會有些困難。 –

+0

如果有一個除Swing以外的clojure GUI庫,我也很感興趣。 – sai

+2

我害怕蹺蹺板將是最好的,你可以找到。 –

回答

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的其他部分更加棘手,因此準備好一些痛苦:)

+0

謝謝,我認爲這是我需要的,但我已經試圖看看如何使用函數並失去了。 我試過你的代碼,但它不起作用(事件,如果我在末尾添加缺少的括號)。 我收到「無法解析符號在這種情況下」。我應該輸入什麼?我收到「無法找到蹺蹺板/鍵盤映射_init」。如果我嘗試導入seesaw.keymap。 – sai

+0

我已經更新到clojure 1.4和蹺蹺板1.4,並且它與下面的代碼一起工作(看起來你需要用大寫字母來書寫這封信,但這並不意味着它抓住了shift-E ......看起來很奇怪):(地圖 - 鍵f「E」(fn [_](警報「您按下了E」))) – sai

+0

是的。 Swing的鍵綁定並不真正解釋鍵狀態,因此「E」表示「E」鍵,而不是「E」字符。如果你想要的話,你必須有一個處理「E班」的處理程序。 –

0

你調用收到一封警告並不真正屬於那裏。應該沒有它的工作。祝你好運,在沒有學習Java的情況下嘗試使用Clojure,我認爲從長遠來看,它不會奏效,但如果真的這樣做會很好。

+0

我刪除了'e',但它仍然不起作用。 隨着經驗的我可能會得到處理越來越多的與Java,但我仍然Clojure的語法當時掙扎... – sai

3

蹺蹺板是偉大的,但它仍然是一個有點棘手找到如何做你想做的,特別是如果(像我)你不是一個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)) 

不幸的是this nice Seesaw tutorial沒有一個按鍵的例子 - 將是很好的補充。

+0

好極了!有用!我已經開始使用本教程。 我怎麼能發現自己這個keybowrd輸入監聽功能?我已經看過API但可能還不夠? 順便說一下,本教程使用包!顯示!。我應該如何修改你的代碼,使它適合那裏。 順便說一句,如果你可以給我一種方法來獲得輸入的字符並處理它,或者指示我來源以瞭解它是如何工作的,它將使我足夠的開始。 – sai

+0

問題1:在這種情況下,我讀了'listen'的蹺蹺板來源,過去曾經使用過點擊處理程序,並且發現這裏有一個類似的按鍵成語。 – JohnJ

+1

Q2:你可以在(show!)之前放置(pack!f) - 你在問什麼? Q3:要查看按下了什麼按鍵,您可以(.getKeyCode e)。 – JohnJ

3

如果您想在全局應用程序中截取鍵,您需要一個KeyEventDispatcher,您可以通過KeyboardFocusManager註冊。如果你想添加基於特定組件鍵值的動作(更高級別 - 好得多),你可能需要KeyBindings http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

然而,在你學習蹺蹺板之前,你需要了解一點點搖擺。 Java Trail是一個很好的開始。 http://docs.oracle.com/javase/tutorial/uiswing/index.html