整个应用程序的全局键绑定在ctrl + h上打开chm文件

时间:2013-03-21 07:16:27

标签: java swing keylistener

我正在尝试在java程序中打开一个chm文件。现在我希望在整个程序中的任何地方按 Ctrl + h 时打开这个chm文件。

我正在使用以下代码打开chm文件,它正在运行。问题是在整个项目中使用 Ctrl + h 打开文件。

public class Testproject {    
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("hh.exe path of the chm file here/abc.chm");
        }
        catch(Exception ex) {
            System.out.println("exceptioin is"+ex);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

添加键绑定的大多数方法都是基于每个组件进行的,因此您必须为所有顶级窗口创建绑定,可能包括对话框,这会非常烦人。所以你必须在evend调度系统的某个中心位置抓住事件。

一种可能的方式似乎是Toolkit.addAWTEventListener,其中自定义侦听器作为第一个参数,KEY_EVENT_MASK作为第二个参数。以这种方式注册的监听器收到所有键击的通知,因此您可以将它们转换为KeyEvent并检查它们是否为 Ctrl + h 并采取相应行动。

答案 1 :(得分:2)

正如我在评论中已经提到的那样,为应用程序全局拦截KeyEvents而设计的类是KeyEventDispatcher

  

KeyEventDispatcher与当前的KeyboardFocusManager合作,定位和分派所有KeyEvent。使用当前KeyboardFocusManager注册的KeyEventDispatcher将在将它们分派到目标之前接收KeyEvent,允许每个KeyEventDispatcher重新定位事件,使用它,调度事件本身或进行其他更改。

因此,任务是实现一个调度程序,它在其调度(KeyEvent)方法中执行您想要的操作,如:

public class MyDispatcher implements KeyEventDispatcher {

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (!e.isConsumed()) {
            if (processMyStuff(e)) {
                e.consume();
            }
        }
        return false;
    }

    protected boolean processMyStuff(KeyEvent e) {
        if (!isMyTrigger(e)) return false;
        doMyStuff();
        return true; 
    }

}

// usage:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
    .addKeyEventDispatcher(new MyDispatcher());

请注意,可以通过向工具包添加全局侦听器来实现目标,并提出一些注意事项:

  • 作为一般规则,使用最适合工作的工具,特别是如果它是为满足确切要求而设计的
  • AWTEventListener可能无法在安全限制的上下文中工作