是否可以在应用程序级别而不是在组件级别上通知关键事件?我所说的应用程序级别的意思不是让一个摆动组件接收关键事件,而是让一个特殊的类监听系统范围的关键事件。
例如,这可以在没有 GUI 的应用程序中使用,或者在需要对关键事件进行更全局处理时使用。
是否可以在应用程序级别而不是在组件级别上通知关键事件?我所说的应用程序级别的意思不是让一个摆动组件接收关键事件,而是让一个特殊的类监听系统范围的关键事件。
例如,这可以在没有 GUI 的应用程序中使用,或者在需要对关键事件进行更全局处理时使用。
您可以使用 java.awt.Toolkit 中的 addAWTEventListener() 方法向您的应用程序添加全局事件侦听器。
当然,这仅在您的应用程序具有焦点时才有效。
因此,对于关键事件,您可以使用:
public class MyGlobalKeyListener implements AWTEventListener {
public void eventDispatched(AWTEvent event) {
// do something here
}
}
// Then on startup register.
AWTEventListener myGlobalKeyListener = new MyGlobalKeyListener();
Toolkey.getDefaultToolkit().addAWTEventListener(myGlobalKeyListener, AWTEvent.KEY_EVENT_MASK);
不确定在本机 Java 中是否可行:在 Windows 中,您必须创建一个 DLL 来挂钩系统(全局)级别的关键事件,我想这是 Unix 或 MacOS 中的不同机制,因此您必须与低级接口级系统 API 来完成这项工作。
信号不是一个通用的概念,但某些信号(如用于关闭的 ctrl+c)如果不是随处使用,则很普遍。可以使用关闭挂钩来收听该特定信号。调用 Runtime.addShutdownHook(Thread) 将让您知道 VM 何时因任何原因关闭并对该事件执行某些操作。