当鼠标退出元素JFrame时,停止mouseEntered执行

时间:2013-12-21 11:06:40

标签: java swing mouseevent javasound mouselistener

我的应用程序在进入不同按钮的区域时会播放不同的声音。当鼠标退出按钮区域时,我想要停止所有声音。我在mouseEntered方法中启动声音,并在mouseExited方法中停止它们:

    @Override
public void mouseEntered(MouseEvent mouse) { 
    allForms.playSounds(mouse);
}

@Override
public void mouseExited(MouseEvent mouse) {
     allForms.stopSounds(mouse);
}

问题是mouseEntered方法不会阻止它在中间执行以开始执行mouseExited

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

您似乎在Swing事件线程上调用了长时间运行的代码,从而占用了线程。一个解决方案是在后台线程中调用playSounds,该线程应该释放Swing线程,以便它响应你并希望允许你调用stopSounds。 SwingWorker可以帮助您创建后台线程,并允许其代码以线程安全的方式与swing进行交互。

另外,触发代码的另一种方法是收听JButton的ButtonModel以获取翻转事件。


修改
您在评论中说明:

  

是否可以使用SwingWorker而无需扩展类?我的课程已经扩展了JFrame。

  • 你的SwingWorker可能属于自己的类,或者如果它足够小,可能是一个匿名的内部类。如果是单独的,它将成为“控制”代码的一部分,假设您已将代码分解为M-V-C模式(或模型 - 视图 - 控制)。
  • 对于它的价值,我很少创建扩展顶级窗口(如JFrame)的GUI代码,避免这样做可以避免问题和挫折。