如何在退出JFrame时停止AudioSystem



我正在制作一个游戏,并添加了音乐。问题是当我关闭游戏时,音乐仍在播放。

播放音乐的脚本:

try {
clip1 = AudioSystem.getClip();
try {
clip1.open(AudioSystem.getAudioInputStream(music));
} catch (IOException | UnsupportedAudioFileException e) {
e.printStackTrace();
}
if (!Settings.Music) {
return;
}
clip1.start();
} catch (LineUnavailableException e) {
e.printStackTrace();
}

循环音乐脚本:

public static void tick() {
if (clip1.isRunning()) {
if (!Settings.Music) {
clip1.stop();
// this makes music stop when player changes settings 
}
}

if (Settings.Music) {
if (!clip1.isRunning()) {
playMusic(Game.music1);
}
}
}

您想要使用WindowListener/WindowStateListener,它允许您注册JFrame的关闭、图标化等事件。在里面,你当然会暂停,或者启动音频。

你可以在这里阅读更多关于如何编写窗口监听器:

WindowStateListener示例(可能是最简单的,没有那么详细,允许您比较以前的状态和新的状态,还有许多其他WindowEvent选项需要检查(:

frame.addWindowStateListener((WindowEvent e) -> {
if (e.getNewState() == WindowEvent.WINDOW_CLOSED 
|| e.getNewState() == WindowEvent.WINDOW_ICONIFIED) {
// TODO stop the audio when window is closed or iconified (minimzed)
}
});

WindowListener示例(稍微详细一点,但这里是为了完整性(:

frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});

最新更新