2

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

我正在使用以下代码打开 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);
        }
    }
}
4

2 回答 2

2

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

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

于 2013-03-21T07:35:07.983 回答
2

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

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

因此,任务是实现一个调度程序,它在 dispatch(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());

请注意,您可以通过向 Toolkit 添加全局侦听器来实现目标,但需要注意以下几点:

  • 作为一般规则,使用最适合工作的工具,特别是如果它是为满足确切要求而设计的
  • AWTEventListener 可能无法在安全受限的上下文中工作
于 2013-03-27T12:17:48.923 回答