Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何用鼠标点击在程序执行的中途中断程序_Java_Swing_Events_Event Handling_Mouselistener - Fatal编程技术网

Java:如何用鼠标点击在程序执行的中途中断程序

Java:如何用鼠标点击在程序执行的中途中断程序,java,swing,events,event-handling,mouselistener,Java,Swing,Events,Event Handling,Mouselistener,如何实现一个mouselistener(或者其他方式,没关系),它将在程序的任何部分处理鼠标点击事件?最好返回到click事件处理程序方法完成时停止的行 我在用秋千。“上下文”是一个不断更新的GUI,但必须在任何时候毫不延迟地响应用户的鼠标单击。事实上,我对事件、使用和覆盖它们的处理程序等方面确实有经验,我想还不太深入,但我所知道的在任何方面都是足够的。你看过吗?这是一个简单的框架,允许您在后台运行计算,并定期发布GUI线程的更新。我无法理解您的第一段,因此如果我理解正确,我的答案适用于您的第二

如何实现一个mouselistener(或者其他方式,没关系),它将在程序的任何部分处理鼠标点击事件?最好返回到click事件处理程序方法完成时停止的行


我在用秋千。“上下文”是一个不断更新的GUI,但必须在任何时候毫不延迟地响应用户的鼠标单击。事实上,我对事件、使用和覆盖它们的处理程序等方面确实有经验,我想还不太深入,但我所知道的在任何方面都是足够的。

你看过吗?这是一个简单的框架,允许您在后台运行计算,并定期发布GUI线程的更新。

我无法理解您的第一段,因此如果我理解正确,我的答案适用于您的第二段。;)

Swing遵循单线程模型。因此,您应该从(EDT)更新UI。该线程也负责将事件传递到代码中,因此得名。如果您在循环中不断更新UI,那么这将使EDT保持繁忙和阻塞。最终结果将是一个不响应用户事件的UI。这是因为事件正在排队,EDT可以选择它们并在代码空闲时将它们交付给代码

游戏通常会遇到这种情况。您可能已经注意到,游戏通常有一个固定的刷新速率,他们称之为FPS(每秒帧数)。通常保持60 FPS就足够了。也就是说,您需要每秒绘制50次UI,但现在看起来您的渲染循环(更新UI)正在持续运行

您需要有独立的线程持续运行,负责绘制UI。这应该被放入缓冲区(
图像
)。然后在要更新的UI元素上调用
repaint()
。该UI元素的
paintComponent()
需要重写,以便它可以复制
image
缓冲区中的图像,并在图形上下文中绘制该图像

现在真正的把戏来了。调用
repaint()
的循环必须进行一些运算,以确保它不会超过绘图60次,即每秒循环60次。如果它这样做了,那么它必须调用
Thread.sleep(sleepTime)
,其中
sleepTime
是循环60次后每秒剩余的毫秒数。有时,您的循环可能需要一秒钟以上的时间来完成60次迭代,然后不要继续进行下一次迭代,而是调用
Thread.yield()
。这将使其他线程有机会使用CPU,例如,可能是您的EDT。为了让事情变得更复杂,不要总是屈服,所以可能需要一些逻辑来确保屈服只持续x次。最后一种情况应该非常罕见,如果有的话。这种情况意味着系统处于重载状态

请记住,
repaint()
是线程安全的,允许从任何线程调用。它在EDT上安排一个
paint()
调用。因此,调用
repaint()
不能保证绘制。因此,您可能需要尝试不同的FPS值,以找到适合您的值

顺便说一下,渲染内存中的
图像的技巧在技术上称为双缓冲区。这使我们能够渲染漂亮的平滑动画

进一步阅读:-

  • -很久以前写过这段代码。您可以使用此代码作为示例
  • -这本书是关于这个主题的

一些问题:Swing,您正在使用什么GUI库?SWT?这里的上下文是什么——你具体想做什么(不是像你描述的那样)?您熟悉事件驱动编程的基本概念吗?我很确定您会想使用线程。一个(或多个)用于GUI,一个用于鼠标单击事件listener@Hovercraft:该问题明确提到“我正在使用swing”。(至少从OP在您最初评论后编辑该问题开始)我明白您的意思,我通过了一些多线程测试(以前从未使用过)。但我突然想到,我可以在事件处理程序中简单地设置一个布尔开关,由几个分散在要中断的方法长度中的if来查看。如果为true,则抛出由整个方法范围的try/catch捕获的异常。在catch中,它通过鼠标单击修改输入来重建GUI。更简单的是:-)如果有一个布尔值要被多个线程读取,那么必须将其标记为
volatile
;-)