2011-04-04 86 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和一切工作。我仍然不确定为什么换挡输入工作,但输入没有。感谢您的反馈!