2011-04-04 64 views
0

我在scala程序中使用了swing鍵綁定。我試圖捕獲JPanel中的鍵入。出於某種原因,我無法重新映射輸入密鑰。換入工作和其他按鍵也起作用。進入什麼是特別的?以下是我的JPanel的代碼片段:無法重新映射「輸入」的Swing鍵綁定

val ADD_SIBLING_TO_SELECTED = "add-sibling-to-selected" 
val enter = KeyStroke.getKeyStroke("shift ENTER")//todo: figure out why plain enter does not work 
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).remove(enter) 
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enter, ADD_SIBLING_TO_SELECTED) 
import java.awt.event.ActionEvent 
getActionMap().put(ADD_SIBLING_TO_SELECTED, new AbstractAction { 
    override def actionPerformed(e: ActionEvent){ 
    println(ADD_SIBLING_TO_SELECTED) 
    } 
}) 
+0

oops,「shift ENTER」是有效的。如果我刪除了「輪班」,行動將不會觸發。 – kcwill2 2011-04-04 05:25:59

回答

1

奇怪;適用於我的機器。這個完整的代碼在JDK 1.6.0_24試圖在斯卡拉2.8.1在Mac OS X 10.6.7:

object ShowKeyPress { 
    def main(args: Array[String]) { 
    import javax.swing._ 
    val frame = new JFrame 
    frame.setVisible(true) 
    frame.add(new JPanel { 
     val ADD_SIBLING_TO_SELECTED = "add-sibling-to-selected" 
     val enter = KeyStroke.getKeyStroke("ENTER") 
     //todo: figure out why plain enter does not work 
     getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).remove(enter) 
     getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enter, ADD_SIBLING_TO_SELECTED) 

     import java.awt.event.ActionEvent 

     getActionMap().put(ADD_SIBLING_TO_SELECTED, new AbstractAction { 
     override def actionPerformed(e: ActionEvent) { 
      println(ADD_SIBLING_TO_SELECTED) 
     } 
     }) 
    }) 
    } 
} 
+0

你的代碼也在這裏工作(幾乎相同的系統,雖然,操作系統×10.6.4) – 2011-04-04 11:40:20

+0

我也使用Scala 2.8.1和1.6.0_24,但在Windows 7上。我可以在不同情況下獲得輸入事件,但不適用於此組件。 – kcwill2 2011-04-07 05:25:23

+0

...和組件有重點?多數民衆贊成在奇怪的... – thoredge 2011-04-07 07:37:02

2

沒什麼特別的ENTER因此,只有恰好是最常用的手勢表示「準備就緒「:-)所以有一個非零概率,即ENTER可能已經綁定在其他地方。一個候選人可以是在框架的根葉片中註冊的默認按鈕。還要注意WHEN_IN_FOCUSED_WINDOW類型的綁定是最後被查詢的。

CU 珍

+0

我一直在想事件會消耗在上游的某處。我的圖形用戶界面有點複雜,有一些分離器和一些選項卡。我試着向包含問題組件的組件添加輸入操作處理程序,但到目前爲止,我還無法獲得輸入事件觸發。 – kcwill2 2011-04-07 05:22:07

0

事實證明,我需要打電話requestFocusInWindow()和使用WHEN_FOCUSED和一切工作。我仍然不確定爲什麼換擋輸入工作,但輸入沒有。感謝您的反饋!