gpt4 book ai didi

java - 例如,事件监听器如何不断轮询以检查按钮是否被单击?

转载 作者:行者123 更新时间:2023-12-01 17:55:47 24 4
gpt4 key购买 nike

例如,Java 中的按钮实际上如何监听事件发生?据我了解,一旦在特殊的EDT(事件调度线程)中单击按钮事件,就会对其进行处理。但是,如果没有“忙等待”,按钮如何知道它实际上已被单击。我理解这一点的唯一方法是,如果在一个对用户隐藏的单独线程(例如事件调度线程)中,每隔一段时间(也许每隔几毫秒)进行一次持续轮询以检查是否是点击。除此之外,按钮单击如何调用代码?

我认为人们会建议这是观察者模式在这里起作用,但是从我看到的示例来看,用户或多或少明确地通知了观察者,所以这与调用几乎没有什么不同只是一个常规方法。

s.setName("IceCream");
public void setName(String name) {
this.name = name;
setChanged();
notifyObservers();
}

然后调用 update() 方法。这不是从头开始的观察者模式,而是使用 Observable 和 Observer 类。

如果有什么需要澄清的,请告诉我

这个问题与我上一个关于如何在不忙等待的情况下不断轮询条件的问题有点相似。 How do you pause a thread until a condition becomes true without busy waiting?

最佳答案

How does, for example, a button in Java actually listen for an event to occur?

该按钮没有任何作用。该按钮仅提供一个处理程序(即,一个 java.awt.event.ActionListener),事件调度线程 (EDT) 在确定给定的鼠标单击时将调用该处理程序用于该按钮。

这是等待鼠标和键盘事件的 EDT。它如何等待将取决于运行它的操作系统。某些操作系统提供单个系统调用,让进程等待来自多个不同源之一的输入。在 Windows 下,它是 WaitForMultipleObjects(...)。在 Linux 下,它是 select(...)poll(...)

假设某个操作系统提供 native 线程,但没有类似 select() 的函数,JVM 可以为每个不同的输入源(例如,键盘线程、鼠标线程)创建一个线程。线程,...),这些都可以将事件推送到 EDT 将使用的队列中。

<小时/>

I assume people are going to suggest it is the Observer Pattern at work here,

基本上是的,但是由于 Java 几乎与命名模式的思想一样古老,因此您可能在源代码中找不到“观察者”一词。

关于java - 例如,事件监听器如何不断轮询以检查按钮是否被单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45001296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com