我正在尝试在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);
}
}
}
答案 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());
请注意,可以通过向工具包添加全局侦听器来实现目标,并提出一些注意事项: