Java 当鼠标退出元素JFrame时停止鼠标执行
我的应用程序在进入不同按钮区域时播放不同的声音。当鼠标离开按钮区域时,我希望所有声音都停止。我在Java 当鼠标退出元素JFrame时停止鼠标执行,java,swing,mouseevent,javasound,mouselistener,Java,Swing,Mouseevent,Javasound,Mouselistener,我的应用程序在进入不同按钮区域时播放不同的声音。当鼠标离开按钮区域时,我希望所有声音都停止。我在mouseEntered方法中启动声音,然后在mouseexeted方法中停止声音: @Override public void mouseEntered(MouseEvent mouse) { allForms.playSounds(mouse); } @Override public void mouseExited(MouseEvent mouse) { allFo
mouseEntered
方法中启动声音,然后在mouseexeted
方法中停止声音:
@Override
public void mouseEntered(MouseEvent mouse) {
allForms.playSounds(mouse);
}
@Override
public void mouseExited(MouseEvent mouse) {
allForms.stopSounds(mouse);
}
问题是<代码>鼠标输入< /代码>方法不会停止它在中间执行,执行<代码>鼠标退出> /代码> <
有没有办法解决这个问题?您似乎在调用Swing事件线程上的一段长时间运行的代码,从而阻塞了该线程。一个解决方案是在后台线程中调用playSounds,这将释放Swing线程,以便它响应您,并希望允许您调用stopSounds。SwingWorker可以帮助您创建后台线程,并允许其代码以线程安全的方式与swing交互 另外,触发代码的另一种方法是监听JButton的ButtonModel中的滚动事件
编辑
您在评论中声明:
是否可以使用SwingWorker而不必扩展类?我的类已经扩展了JFrame
- 你的SwingWorker可以在它自己的类中,或者如果它足够小的话,也可以是一个匿名的内部类。如果分开,它将是“控制”代码的一部分,假设您已经将代码分解为M-V-C模式(或模型视图控制)
- 值得一提的是,我很少(如果有的话)创建扩展顶级窗口(如JFrame)的GUI代码,避免了这一点使我避免了问题和挫折