【问题标题】:Repaint and Mouselistener Java重绘和 Mouselistener Java
【发布时间】:2018-11-24 16:44:19
【问题描述】:

所以我有一个悖论,我在大型机中添加了一个 mouseListener。当鼠标进入时,它有一个循环来检查所经过的时间是否超过了某个限制,因此它被注册为保持。它必须在一个线程中,否则我无法检查点击,因为我的主线程会被阻塞(或者会被阻塞吗?)。但问题是我想在仍然单击鼠标按钮时显示信息,要求我从线程内调用重绘,这不起作用,因为重绘只能从主线程工作,但这个必须是免费的鼠标监听器... 有谁知道如何解决这个问题?

【问题讨论】:

  • “重绘只适用于主线程”不是真的。 paint 仅适用于事件调度程序线程,但 repaint 可以在任何地方使用。
  • 嗯...但是当我尝试从线程调用 repaint 时,它没有任何效果...
  • 贴出你的代码,让我们看看问题出在哪里。
  • 让我先试试 camickrs 解决方案,看看这是否适合我

标签: java multithreading jframe mouselistener


【解决方案1】:

当鼠标进入时,它有一个循环来检查所经过的时间是否超过了一定的限制

不要使用循环。如果这在侦听器中执行,那么您将阻塞事件调度线程 (EDT)。

改为使用Swing Timer。当您输入组件时,您将启动计时器。然后计时器将在您指定的时间间隔后生成一个事件。

但是,如果生成了其他事件并且您想重置计时器,您也可以停止计时器。

这不会阻塞Event Dispatch Thread (EDT),仍然会正常生成事件。

我想在仍然单击鼠标按钮时显示信息

不确定“仍然点击”是什么意思。如果按钮仍被按下并且您正在从 ActionListener 执行代码,您将阻塞 EDT,并且 GUI 将无法重新绘制自身,直到长时间运行的任务完成。

阅读 Concurrency 上的 Swing 教程部分,了解有关 EDT 的更多信息。

【讨论】:

  • 我会尝试实现这个,谢谢你的帮助!就鼠标按下而言,我目前对此事件的设置是当我按下为真时,我在 MouseListener 中设置了一个布尔值。当超过时间限制时,将执行保持功能,除非我已经释放了将 bool 设置为 false 的鼠标。
  • 所以你有一个定时器,你从一个 mousePressed 事件开始,然后你用 mouseReleased 事件停止它。
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多