java - 幕后事件和事件处理

标签 java c++ events event-handling

我刚刚使用 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/

相关文章:

c++ - 在 C++ 的一行中插入多个输入

c++ - boost 程序选项 : linking error

javascript - View 模型可访问的 Durandal 导航事件

model-view-controller - Ext JS 4 - 理解 this.control、选择器和事件处理

c# - 检查 BalloonTooltip 是否被用户关闭

java - Jenkins发现找不到ssh key

java - Tomcat 7 异步处理失败 - 只有一个请求同时处理

java - 无法使用 JAX-RS 上传文件

c++ - Rcpp:如果声明了 IntegerVector,数组上的段错误 > 698152

java - 组织.postgresql.util.PSQLException : FATAL: database "pma-springbootdb"