java音樂(lè)播放器課程設(shè)計(jì)
一、課程設(shè)計(jì)目的
1、編程設(shè)計(jì)音樂(lè)播放軟件,使之實(shí)現(xiàn)音樂(lè)播放的功能。
2、培養(yǎng)學(xué)生用程序解決實(shí)際問(wèn)題的能力和興趣。
3、加深java中對(duì)多媒體編程的應(yīng)用。
二、課程設(shè)計(jì)的要求
利用學(xué)到的編程知識(shí)和編程技巧,要求學(xué)生:
1、系統(tǒng)設(shè)計(jì)要能完成題目所要求的功能,設(shè)計(jì)的軟件可以進(jìn)行簡(jiǎn)單的播放及其他基本功能。
2、編程簡(jiǎn)練,可用,盡可能的使系統(tǒng)的功能更加完善和全面
3、說(shuō)明書(shū)、流程圖要清楚。
三、課程設(shè)計(jì)內(nèi)容
1、課程設(shè)計(jì)的題目及簡(jiǎn)介
音樂(lè)播放軟件要求:
有圖形界面,能播放MP3歌曲,有播放列表,前一首、后一首等常用播放軟件功能。
2、設(shè)計(jì)說(shuō)明
主要運(yùn)用多媒體編程、圖形界面、數(shù)組及循環(huán)進(jìn)行設(shè)計(jì),從而實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放。
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)聽(tīng)器。
MediaPlayer(String title) {
super(title);
/* 關(guān)閉按鈕的實(shí)現(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è)置一個(gè)菜單
Menu f = new Menu("文件");
// 往設(shè)置的菜單添加菜單項(xiàng)
MenuItem mi = new MenuItem("打開(kāi)");
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è)置一個(gè)菜單欄
MenuBar mb = new MenuBar();
mb.add(f);
mb.add(c);
mb.add(l);
// 將構(gòu)造完成的菜單欄交給當(dāng)前程序的窗口;
setMenuBar(mb);
}
// 動(dòng)作時(shí)間響應(yīng)成員;捕捉發(fā)送到本對(duì)象的各種事件;
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;
}
// 此事表明擁護(hù)選擇了“播放”命令;
// 如果當(dāng)前有一個(gè)文件可以播放則執(zhí)行播放命令;
if (e.getActionCommand().equals("播放")) {
if (player != null) {
player.start();
}
return;
}
// 如果當(dāng)前正在播放某一文件,則執(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;
}
// 用戶(hù)選擇要播放的媒體文件
if (e.getActionCommand().equals("打開(kāi)")) {
FileDialog fd = new FileDialog(this, "打開(kāi)媒體文件", FileDialog.LOAD);
// fd.setDirectory(currentDirectory);
fd.setVisible(true);
// 如果用戶(hù)放棄選擇文件,則返回
if (fd.getFile() == null) {
return;
}
// 保存了所選文件的名稱(chēng)及其路徑名稱(chēng)已被稍后使用
// 同時(shí)設(shè)置當(dāng)前文件夾路徑
selectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selectfile;
// 將用戶(hù)選擇的文件作為一個(gè)菜單項(xiàng)加入播放列表,該菜單項(xiàng)名為該文件名;
// 被點(diǎn)擊后給出的命令串是該文件的全路徑名
MenuItem mi = new MenuItem(selectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
// 程序邏輯運(yùn)行到次表示用戶(hù)選擇了一個(gè)“播放列表”中的媒體文件
// 此時(shí)可以通過(guò)如下動(dòng)作獲得該文件的全路徑名
cufile = e.getActionCommand();
selectfile = cufile;
}
// 如果存在一個(gè)播放器,則先將其關(guān)閉,稍后再重新創(chuàng)建
// 創(chuàng)建播放器時(shí)需要捕捉一些異常
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("無(wú)法創(chuàng)建播放器");
return;
}
first = false;
setTitle(selectfile);
// 設(shè)置處理播放控制器實(shí)際的對(duì)象;
/**/
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ù)進(jìn)行界面的繪制 // 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()時(shí)ControllerClosedEvent事件出現(xiàn)
// 如果存在視覺(jué)部件,則該部件應(yīng)該拆除(為了一致起見(jiàn),我們對(duì)控制面版部件也執(zhí)行同樣的操作,下一次需要時(shí)再構(gòu)造)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
}
// 播放結(jié)束時(shí),將播放指針置于文件之首,如果設(shè)定了循環(huán)播放,則再次啟動(dòng)播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
// PrefetchCompletEvent事件發(fā)生后調(diào)用start,正式啟動(dòng)播放
if (e instanceof PrefetchCompleteEvent) {
player.start();
return;
}
// 本事件表示由于播放的資源已經(jīng)確定;此時(shí)要將媒體的圖形conmopnent
// 如果有顯示出來(lái),同時(shí)將播放器player的控制顯示到窗口里;
if (e instanceof RealizeCompleteEvent) {
// 如果媒體中有圖像,將對(duì)應(yīng)圖像component載入窗體;
vc = player.getVisualComponent();
if (vc != null)
tainer.add(vc, BorderLayout.CENTER);
// 將對(duì)應(yīng)控制器component載入窗體;
cc = player.getControlPanelComponent();
cc.setBackground(Color.blue);
if (cc != null)
tainer.add(cc, BorderLayout.SOUTH);
// 有一些特殊媒體在播放時(shí)提供另外的控制手段,將控制器一并加入窗口;
/*
* 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;
}
}
}
}
程序運(yùn)行結(jié)果:


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

