java音樂播放器課程設(shè)計
一、課程設(shè)計目的
1、編程設(shè)計音樂播放軟件,使之實現(xiàn)音樂播放的功能。
2、培養(yǎng)學(xué)生用程序解決實際問題的能力和興趣。
3、加深java中對多媒體編程的應(yīng)用。
二、課程設(shè)計的要求
利用學(xué)到的編程知識和編程技巧,要求學(xué)生:
1、系統(tǒng)設(shè)計要能完成題目所要求的功能,設(shè)計的軟件可以進行簡單的播放及其他基本功能。
2、編程簡練,可用,盡可能的使系統(tǒng)的功能更加完善和全面
3、說明書、流程圖要清楚。
三、課程設(shè)計內(nèi)容
1、課程設(shè)計的題目及簡介
音樂播放軟件要求:
有圖形界面,能播放MP3歌曲,有播放列表,前一首、后一首等常用播放軟件功能。
2、設(shè)計說明
主要運用多媒體編程、圖形界面、數(shù)組及循環(huán)進行設(shè)計,從而實現(xiàn)簡單的音樂播放。
package com.mainyin;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MediaPlayer extends JFrame implements ActionListener,
ItemListener, ControllerListener {
String title;
Player player;
boolean first = true, loop = false;
Component vc, cc;
String currentDirectory=null;
// 構(gòu)造函數(shù),其中包括了設(shè)置響應(yīng)窗口事件的監(jiān)聽器。
MediaPlayer(String title) {
super(title);
/* 關(guān)閉按鈕的實現(xiàn)。。 */
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
public void windowClosed(WindowEvent e) {
if (player != null)
player.close();
System.exit(0);
}
});
// 調(diào)用程序菜單欄的方法成員完成菜單的布置
setupMenu();
setSize(400, 400);
setVisible(true);
}
// 本方法用以設(shè)置程序菜單欄
public void setupMenu() {
// 設(shè)置一個菜單
Menu f = new Menu("文件");
// 往設(shè)置的菜單添加菜單項
MenuItem mi = new MenuItem("打開");
f.add(mi);
mi.addActionListener(this);
f.addSeparator();
CheckboxMenuItem cbmi = new CheckboxMenuItem("循環(huán)", false);
cbmi.addActionListener(this);
f.add(cbmi);
f.addSeparator();
MenuItem ee = new MenuItem("退出");
ee.addActionListener(this);
f.add(ee);
f.addSeparator();
Menu l = new Menu("播放列表");
Menu c = new Menu("播放控制");
MenuItem move = new MenuItem("播放");
move.addActionListener(this);
c.add(move);
c.addSeparator();
MenuItem pause = new MenuItem("暫停");
pause.addActionListener(this);
c.add(pause);
c.addSeparator();
MenuItem stop = new MenuItem("停止");
stop.addActionListener(this);
c.add(stop);
c.addSeparator();
// 設(shè)置一個菜單欄
MenuBar mb = new MenuBar();
mb.add(f);
mb.add(c);
mb.add(l);
// 將構(gòu)造完成的菜單欄交給當前程序的窗口;
setMenuBar(mb);
}
// 動作時間響應(yīng)成員;捕捉發(fā)送到本對象的各種事件;
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String cufile, selectfile, currentDirectory;
if (e.getActionCommand().equals("退出")) {
// 調(diào)用dispose以便執(zhí)行windowClosed
dispose();
return;
}
// 此事表明擁護選擇了“播放”命令;
// 如果當前有一個文件可以播放則執(zhí)行播放命令;
if (e.getActionCommand().equals("播放")) {
if (player != null) {
player.start();
}
return;
}
// 如果當前正在播放某一文件,則執(zhí)行暫停;
if (e.getActionCommand().equals("暫停")) {
if (player != null) {
player.stop();
}
return;
}
// 停止命令的響應(yīng);
if (e.getActionCommand().equals("停止")) {
if (player != null) {
player.stop();
player.setMediaTime(new Time(0));
}
return;
}
// 用戶選擇要播放的媒體文件
if (e.getActionCommand().equals("打開")) {
FileDialog fd = new FileDialog(this, "打開媒體文件", FileDialog.LOAD);
// fd.setDirectory(currentDirectory);
fd.setVisible(true);
// 如果用戶放棄選擇文件,則返回
if (fd.getFile() == null) {
return;
}
// 保存了所選文件的名稱及其路徑名稱已被稍后使用
// 同時設(shè)置當前文件夾路徑
selectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selectfile;
// 將用戶選擇的文件作為一個菜單項加入播放列表,該菜單項名為該文件名;
// 被點擊后給出的命令串是該文件的全路徑名
MenuItem mi = new MenuItem(selectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
// 程序邏輯運行到次表示用戶選擇了一個“播放列表”中的媒體文件
// 此時可以通過如下動作獲得該文件的全路徑名
cufile = e.getActionCommand();
selectfile = cufile;
}
// 如果存在一個播放器,則先將其關(guān)閉,稍后再重新創(chuàng)建
// 創(chuàng)建播放器時需要捕捉一些異常
if (player != null) {
player.close();
}
try {
player = Manager.createPlayer(new MediaLocator("file:" + cufile));
} catch (Exception e2) {
System.out.println(e2);
return;
}/*
* catch(NoPlayerException e2){ System.out.println("不能找到播放器");
* return ; }
*/
if (player == null) {
System.out.println("無法創(chuàng)建播放器");
return;
}
first = false;
setTitle(selectfile);
// 設(shè)置處理播放控制器實際的對象;
/**/
player.addControllerListener(this);
player.prefetch();
}
// 菜單狀態(tài)改變事件的響應(yīng)函數(shù);
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new MediaPlayer("播放器");
}
// 調(diào)用繪圖函數(shù)進行界面的繪制 // public void update() {
// }
// 繪圖函數(shù)成員 //public void paint(Graphics g) {
// }
public void controllerUpdate(ControllerEvent e) {
// TODO Auto-generated method stub
Container tainer = getContentPane();
// 調(diào)用player.close()時ControllerClosedEvent事件出現(xiàn)
// 如果存在視覺部件,則該部件應(yīng)該拆除(為了一致起見,我們對控制面版部件也執(zhí)行同樣的操作,下一次需要時再構(gòu)造)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
}
// 播放結(jié)束時,將播放指針置于文件之首,如果設(shè)定了循環(huán)播放,則再次啟動播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
// PrefetchCompletEvent事件發(fā)生后調(diào)用start,正式啟動播放
if (e instanceof PrefetchCompleteEvent) {
player.start();
return;
}
// 本事件表示由于播放的資源已經(jīng)確定;此時要將媒體的圖形conmopnent
// 如果有顯示出來,同時將播放器player的控制顯示到窗口里;
if (e instanceof RealizeCompleteEvent) {
// 如果媒體中有圖像,將對應(yīng)圖像component載入窗體;
vc = player.getVisualComponent();
if (vc != null)
tainer.add(vc, BorderLayout.CENTER);
// 將對應(yīng)控制器component載入窗體;
cc = player.getControlPanelComponent();
cc.setBackground(Color.blue);
if (cc != null)
tainer.add(cc, BorderLayout.SOUTH);
// 有一些特殊媒體在播放時提供另外的控制手段,將控制器一并加入窗口;
/*
* gc=player.getGainControl(); gcc=gc.getControlComponent();
* if(gcc!=null) tainer.add(gcc,BorderLayout.NORTH);
*/
// 根據(jù)媒體文件中是否有圖像,設(shè)定相應(yīng)的窗口大小
if (vc != null) {
pack();
return;
} else {
setSize(300, 75);
setVisible(true);
return;
}
}
}
}
程序運行結(jié)果:


總結(jié):
經(jīng)過這幾天的Java課程設(shè)計,讓我知道了做課程設(shè)計的一般方法,通過各種努力終于完成了設(shè)計要求.這次課程設(shè)計基本上含蓋了大學(xué)一年學(xué)習(xí)到的Java語言知識點,課設(shè)題目要求不僅要求對課本知識有較深刻的了解,同時要求程序設(shè)計者有較強的思維和動手能力。這次課設(shè)使我了解我編程思想和編程技巧,也再一次熟悉了開發(fā)程序的過程,包括構(gòu)思、設(shè)計、編寫、調(diào)試、修訂。
做課程設(shè)計不僅讓我修補了以前學(xué)習(xí)的漏洞,也讓我跟激發(fā)了對程序開發(fā)的興趣和自信。創(chuàng)新思維至關(guān)重要,這應(yīng)該可以借鑒在老師的教學(xué)工作上,這不僅讓我們寫出精簡的代碼,也有助于開發(fā)出高效的程序。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用java生成json時產(chǎn)生棧溢出錯誤問題及解決方案
這篇文章主要介紹了使用java生成json時產(chǎn)生棧溢出錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
解決mybatis plus字段為null或空字符串無法保存到數(shù)據(jù)庫的問題
這篇文章主要介紹了解決mybatis plus字段為null或空字符串無法保存到數(shù)據(jù)庫的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

