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



如何实现一个鼠标侦听器(或其他方式,无关紧要)来处理程序任何部分的鼠标点击事件?当点击事件处理程序方法完成时,最好返回到它停止的行。

我在用秋千。"上下文"是一个不断更新的GUI,但必须在任何时候对用户的鼠标点击做出响应,不得延迟。事实上,我确实有处理事件、使用和覆盖其处理程序等方面的经验,我想不太深入,但到目前为止,我所知道的已经足够了。

我听不懂你的第一段,所以如果我理解正确的话,我的答案是你的第二段。)

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

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

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

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

请记住,repaint()是线程安全的,允许从任何线程调用。它在美国东部时间安排paint()通话。因此,调用repaint()并不能保证绘制。因此,您可能需要尝试不同的FPS值,以找到适合您的值。

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

进一步阅读:-

  • 兰辛-这个代码写了很长时间了。您可以使用此代码作为示例
  • http://java.sun.com/docs/books/performance/1st_edition/html/JPSwingThreads.fm.html
  • Java中的杀手游戏编程——这本书就是关于这个主题的

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

相关内容

  • 没有找到相关文章

最新更新