我刚刚使用 SDL 编写了一些简单的程序,这让我回想起我编写的一些 Java GUI。
在简单的 SDL 程序中,我有一个循环来检查任何事件(按键、鼠标点击等...)并对它们使用react。本质上,它是在轮询输入。
在 Java 中,您将监听器附加到 GUI 对象,并且监听器会在特定事件发生时被触发。
我的问题是,Java 是否只是在后台为我们处理这个轮询循环并解决诸如单击哪个 GUI 控件之类的事情以便它可以触发正确的监听器,或者是否有更复杂的事情发生?
我知道 Qt 有一个类似于 Java 的事件系统,您可以在其中使用槽将处理程序连接到 GUI 控件。这是否也只是处理所有轮询并计算出为我们单击了哪个控件?或者,是否还有更复杂的事情发生?
更新
可能是我问的不够清楚。我真的很想知道事件如何桥接操作系统层 - 应用程序层边界。应用程序是否轮询操作系统层并将事件信息拉入应用程序?或者操作系统是否有某种方式来中断/通知应用程序事件已发生并将事件信息推送到应用程序。
有人向我建议了第三种解决方案,即应用程序调用阻塞的 native 函数,例如:
Event e = someNativeFunction(); // blocks until someNativeFunction() returns an event
最佳答案
“...Java 是否只是在后台为我们处理这个轮询循环...?”
差不多,是的。 UI 系统为程序提供对包含已发生事件和目标的队列的访问。该程序运行一个循环,从该队列中请求项目,然后执行任何操作。像 Qt 和 Java 这样的库调用小部件类中的特殊函数,这些函数告诉它们一个事件已经发生,这样系统就可以从那里运行,但是由 API 规定。为此,该库必须将系统特定的窗口 ID 转换为管理该小部件的类。
Qt 以 protected 虚拟 onXxxxEvent()
函数的形式提供对此函数的访问。许多小部件的标准行为是生成信号以响应事件,但这些总是特定于特定小部件的事件的某种翻译形式。 Qt 为您提供对此的访问权限,以便您可以覆盖小部件处理事件的方式,或者为它以前从未监听过的事件添加额外的行为(通过子类化)。
每个 UI 系统都略有不同,但根据我的经验,它们在这方面基本相同。我们在这里谈论的是原始 win32 和 Xlib。
关于java - 幕后事件和事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5044409/