Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 当鼠标退出元素JFrame时停止鼠标执行_Java_Swing_Mouseevent_Javasound_Mouselistener - Fatal编程技术网

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代码,避免了这一点使我避免了问题和挫折

是否可以在不扩展类的情况下使用SwingWorker?我的类已经扩展了JFrame。