首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JBuilder 開發音頻播放器:JavaSound API 實戰與多線程界面設計

     編輯:Java 相關知識

技術選型

  • IDE:Borland JBuilder (可視化 GUI 構建)
  • 音頻 API:com.sun.media.sound.JavaSoundAudioClip (實現 java.applet.AudioClip 接口)
  • 支持格式:WAV (示例),可擴展支持 AU、AIFF、MIDI 等

項目結構 (4 類)

類名職責
MyFrame主窗口 GUI:菜單、工具欄、播放列表、控制按鈕、GIF 面板
AudioPlay音頻播放引擎:多線程播放、暫停/停止控制、異常處理
GifPanel動畫面板組件:封裝 GIF 圖片顯示邏輯
Test啟動類:設置系統外觀、創建主窗口

GUI 佈局詳解

[菜單欄]
[工具欄: 打開文件]
[播放控制區]  ←→  [GIF 動畫區]
  後退 ◀  播放 ▶  停止 ■  前進 ▶
[播放列表 JList]
  • 控件:JList (播放列表)、JButton x4 (控制)、JFileChooser (文件選擇)
  • 右側 GifPanel 增加視覺活躍度

核心播放引擎: AudioPlay 類

多線程設計 (關鍵)

播放不能阻塞 EDT (事件分發線程),否則界面凍結。實現 Runnable 接口,由獨立線程執行播放循環。

public class AudioPlay implements Runnable {
    private JavaSoundAudioClip clip;
    private boolean playing = false, stopped = false, threadExit = false;
    private Thread playerThread;

    public void start(File file) {
        playing = true; stopped = false;
        try (FileInputStream fis = new FileInputStream(file)) {
            clip = new JavaSoundAudioClip(fis);
        } catch (Exception e) { System.out.println("Load error"); return; }
        
        playerThread = new Thread(this);
        playerThread.start();
    }

    public void run() {
        if (playing && !stopped && clip != null) {
            try { clip.play(); } 
            catch (Exception e) { /* 忽略 */ }
        }
    }

    public void stop() {
        stopped = true; threadExit = true;
        if (playing) { playing = false; clip.stop(); }
    }

    public void pause() { // 實為停止,JavaSoundAudioClip 無真正暫停
        if (playing) clip.stop();
    }
}

狀態標志三元組 (playing/stopped/threadExit) 確保線程安全終止。

異常處理策略

  • 文件加載異常:捕獲並記錄,不拋出,保持界面可用
  • 播放異常:靜默吞噬 (示例簡化),生產環境應記錄日誌
  • 資源關閉:try-with-resources 確保 FileInputStream 關閉

文件過濾器: WavFileFilter 內部類


class WavFileFilter extends javax.swing.filechooser.FileFilter {
    private String ext; // "wav"
    
    public boolean accept(File f) {
        if (f.isDirectory()) return true; // 顯示目錄便於導航
        String name = f.getName();
        int idx = name.lastIndexOf('.');
        return idx > 0 && idx < name.length()-1 
            && name.substring(idx+1).equalsIgnoreCase(ext);
    }
    
    public String getDescription() {
        return ext.equals("wav") ? "Wav File (*.wav)" : "";
    }
}

設置:fileChooser.setFileFilter(new WavFileFilter("wav")),僅顯示 .wav 文件與目錄。

系統外觀適配


try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    new Test(); // 創建主窗口
} catch (Exception e) { e.printStackTrace(); }

getSystemLookAndFeelClassName() 自動檢測平台 (Windows/Metal/Motif/Gtk),setLookAndFeel 應用原生外觀,提升用戶熟悉度。

擴展建議

  1. 播放列表管理:DefaultListModel 動態增刪,支持拖拽排序
  2. 進度條:定時器輪詢 clip.getMediaTime() 更新 JProgressBar
  3. 音量控制:FloatControl.Type.MASTER_GAIN 配合 JSlider
  4. 格式支持擴展:AudioSystem.getAudioFileTypes() 動態獲取支持格式,工廠模式創建對應 Clip
  5. 播放模式:單曲循環/列表循環/隨機播放 (狀態模式實現)
  6. ID3 標籤讀取:顯示標題/藝術家/專輯信息

總結

本項目展示了在 JBuilder 中構建多媒體桌面應用的完整流程:可視化 GUI 設計、JavaSound API 音頻播放、多線程防界面凍結、文件過濾器、系統外觀適配。核心難點在於音頻播放與 Swing EDT 的協作,通過 Runnable + 狀態標志模式妥善解決。代碼結構清晰,易於擴展為功能完整的播放器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved