You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中为捡硬币事件添加音频提示?java.applet已过时

在Java中为拾取硬币事件添加音频提示的方案

由于java.applet.* API已过时,下面提供两种实用的替代方案:

方案一:使用JDK自带的javax.sound.sampled API

这是Java SE标准库的一部分,无需额外依赖,适合播放WAV、AU等常见音频格式。

1. 封装音频播放工具类

先写一个工具类封装播放逻辑,避免重复代码,同时用线程保证不阻塞UI:

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

public class AudioPlayer {
    public static void playSound(String filePath) {
        new Thread(() -> {
            try {
                File soundFile = new File(filePath);
                AudioInputStream audioStream = AudioSystem.getAudioInputStream(soundFile);
                AudioFormat format = audioStream.getFormat();
                DataLine.Info info = new DataLine.Info(Clip.class, format);
                Clip clip = (Clip) AudioSystem.getLine(info);
                
                clip.open(audioStream);
                clip.start();
                
                // 播放结束后自动释放资源
                clip.addLineListener(event -> {
                    if (event.getType() == LineEvent.Type.STOP) {
                        clip.close();
                        try {
                            audioStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

2. 在拾取硬币事件中调用

修改你的movePlayer方法,在收集硬币的分支里加入音频播放:

private void movePlayer(int dRow, int dColumn) {
        maze[player.getRow()][player.getColumn()].setIcon(PATH);
        
        if (maze[player.getRow()+dRow][player.getColumn()+dColumn].getIcon() == COIN) {
            numCoinsCollected++;
            scoreLabel.setText(Integer.toString(numCoinsCollected));
            // 播放拾取硬币的音频,替换为你的文件路径
            AudioPlayer.playSound("src/resources/sounds/coin-pick.wav");
        }
        
        player.move(dRow, dColumn);
        maze[player.getRow()][player.getColumn()].setIcon(player.getIcon());
        
        if (numCoinsCollected == NUM_COINS) {
            gameTimer.stop();
            JOptionPane.showMessageDialog(this, "WINNER!");
        }
    }

方案二:使用JavaFX的MediaPlayer

如果你的项目基于JavaFX,或者需要支持MP3等更多格式,推荐使用这个方案。

1. 配置依赖(非JavaFX项目需添加)

如果不是默认JavaFX项目,以Maven为例添加依赖:

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-media</artifactId>
    <version>21</version> <!-- 版本需与你的JDK匹配 -->
</dependency>

2. 封装播放工具类

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import java.io.File;

public class FXAudioPlayer {
    public static void playSound(String filePath) {
        File soundFile = new File(filePath);
        Media media = new Media(soundFile.toURI().toString());
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        
        mediaPlayer.play();
        // 播放完毕释放资源
        mediaPlayer.setOnEndOfMedia(mediaPlayer::dispose);
    }
}

3. 在事件中调用

同样在拾取硬币的代码块中加入:

if (maze[player.getRow()+dRow][player.getColumn()+dColumn].getIcon() == COIN) {
    numCoinsCollected++;
    scoreLabel.setText(Integer.toString(numCoinsCollected));
    FXAudioPlayer.playSound("src/resources/sounds/coin-pick.mp3");
}

注意事项

  • 路径建议:优先使用项目内的相对路径或类路径加载(比如getClass().getResource("/sounds/coin.wav")),避免绝对路径的兼容性问题。
  • 格式支持:javax.sound.sampled主打无压缩音频;JavaFX MediaPlayer支持MP3、FLAC等更多压缩格式。

内容的提问来源于stack exchange,提问作者Srjm12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:33:13