com.sun.media.sound.JavaSoundAudioClip (實現 java.applet.AudioClip 接口)| 類名 | 職責 |
|---|---|
| MyFrame | 主窗口 GUI:菜單、工具欄、播放列表、控制按鈕、GIF 面板 |
| AudioPlay | 音頻播放引擎:多線程播放、暫停/停止控制、異常處理 |
| GifPanel | 動畫面板組件:封裝 GIF 圖片顯示邏輯 |
| Test | 啟動類:設置系統外觀、創建主窗口 |
[菜單欄] [工具欄: 打開文件] [播放控制區] ←→ [GIF 動畫區] 後退 ◀ 播放 ▶ 停止 ■ 前進 ▶ [播放列表 JList]
JList (播放列表)、JButton x4 (控制)、JFileChooser (文件選擇)GifPanel 增加視覺活躍度播放不能阻塞 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 關閉
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 應用原生外觀,提升用戶熟悉度。
DefaultListModel 動態增刪,支持拖拽排序clip.getMediaTime() 更新 JProgressBarFloatControl.Type.MASTER_GAIN 配合 JSliderAudioSystem.getAudioFileTypes() 動態獲取支持格式,工廠模式創建對應 Clip本項目展示了在 JBuilder 中構建多媒體桌面應用的完整流程:可視化 GUI 設計、JavaSound API 音頻播放、多線程防界面凍結、文件過濾器、系統外觀適配。核心難點在於音頻播放與 Swing EDT 的協作,通過 Runnable + 狀態標志模式妥善解決。代碼結構清晰,易於擴展為功能完整的播放器。