2015-06-18 144 views
0

此代码的工作很适合我,使键绑定更舒适,通过调用诸如那些遵循:如何在密钥绑定中使用密钥名称?

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import static javax.swing.KeyStroke.getKeyStroke; 

public abstract class KeyBoundButton extends JButton{ 

    public abstract void action(ActionEvent e); 

    public KeyBoundButton(String actionMapKey, int key, int mask) 
    { 
    Action myAction = new AbstractAction() 
    { 
     @Override public void actionPerformed(ActionEvent e) 
     { 
     action(e); 
     } 
    }; 

    setAction(myAction); 

    getInputMap(WHEN_IN_FOCUSED_WINDOW) 
        .put(getKeyStroke(key, mask),actionMapKey); 
    getActionMap().put(      actionMapKey, myAction); 

    } 
} 

电话:

button = new KeyBoundButton("WHATEVER", VK_X, CTRL_DOWN_MASK) 
{ 
    @Override 
    public void action(ActionEvent e) 
    { 
    JOptionPane.showMessageDialog(null,"Ctrl-X was pressed"); 
    } 
}; 

但我没有线索如何使用钥匙名称WHATEVER,无论是智能或其他方式,在程序中的其他地方。

我想知道button.getActionCommand()但它返回null,即使我在类定义中插入此行action(e)后:

setActionCommand(actionMapKey); 

的关键是什么名字的目的是什么?我是否应该在程序中的某个地方使用它,而不是定义键绑定?

+0

为什么我们关心问题是否被编辑?只要改变你的问题。你不需要做出更大胆的改变。 –

回答

1

如果您只有一个事件侦听器,则使用键名称。

一般:

setOnKeyListener(new OnKeyListener(){ 
    void onKeyPressed(KeyEvent k){ 
      if(k.getKey() == KeyEvent.VK_ENTER) 
        //Handle ENTER key 
      if(k.getKey() == KeyEvent.VK_ESCAPE) 
        //Handle ESC key 
    } 
); 

此代码是从我的记忆写的,可能不是从Java API的实际对象名称。

+0

@马科斯 - 我没有问我想要什么。我再次以不同的标题和稍微不同的内容问了这个问题。 – DSlomer64

+0

你问如何使用正确的名字? –

+0

@ Marcos - 我正在寻找的答案的新线程是[这里](http://stackoverflow.com/questions/30967709/how-do-i-access-the-name-of-the-action-定义 - 在-A-java的键结合/ 30967930#30967930) – DSlomer64