?? mediaplayer.java
字號(hào):
//程序所用到的各種程序包
import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.GainControl;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.swing.JFrame;
//本程序?qū)?yīng)的類;
class MediaPlayer
extends JFrame
implements ActionListener, ControllerListener, ItemListener {
//MediaPlayer類的變量成員的聲明;
//JMF提供的播放器對(duì)象;
Player player;
Component vc, cc, gcc;
GainControl gc;
//first值用來(lái)控制在剛開(kāi)始程序時(shí)顯示一幅歡迎界面;loop用以標(biāo)記是否循環(huán)播放;
boolean first = true, loop = false;
//設(shè)立一個(gè)字符串記錄當(dāng)前打開(kāi)文件的路徑
String currentDirectory;
MediaPlayer(String title) {
super(title);
// 利用一個(gè)adapter實(shí)現(xiàn)對(duì)用戶點(diǎn)擊窗口系統(tǒng)菜單的關(guān)閉按鈕
// 時(shí)的響應(yīng);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
//調(diào)用dispose以執(zhí)行windowClosed
dispose();
}
public void windowClosed(WindowEvent e) {
if (player != null)
player.close();
System.exit(0);
}
});
//調(diào)用設(shè)置程序菜單欄的方法成員完成菜單的布置
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)");
mi.addActionListener(this);
f.add(mi);
f.addSeparator();
CheckboxMenuItem cbmi = new CheckboxMenuItem("循環(huán)", false);
cbmi.addItemListener(this);
f.add(cbmi);
f.addSeparator();
mi = new MenuItem("退出");
mi.addActionListener(this);
f.add(mi);
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();
//將設(shè)置的菜單依次加入程序的菜單欄中去
mb.add(f);
mb.add(c);
mb.add(l);
//將構(gòu)造完成的菜單欄交給當(dāng)前程序的窗口;
setMenuBar(mb);
}
//事件響應(yīng)成員;捕捉發(fā)送到本對(duì)象的各種事件;
public void actionPerformed(ActionEvent e) {
//設(shè)一個(gè)字符串用于暫存打開(kāi)的媒體文件的路徑;
String cufile , selcectfile;
if (e.getActionCommand().equals("退出")) {
// 調(diào)用dispose以便執(zhí)行windowClosed
dispose();
return;
}
//次事件表明用戶選擇了"播放"菜單命令;
//如果當(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;
}
//次事件表明用戶選擇了"播放"菜單命令;
//如果當(dāng)前有一個(gè)文件可以播放則執(zhí)行播放命令;
if (e.getActionCommand().equals("停止")) {
if (player != null) {
player.stop();
player.setMediaTime(new Time(0));
}
return;
}
//用戶選擇要播放的媒體文件
if (e.getActionCommand().equals("打開(kāi)")) {
FileDialog fd = new FileDialog(this, "打開(kāi)媒體文件", FileDialog.LOAD);
fd.setDirectory(currentDirectory);
fd.show();
// 如果用戶放棄選擇文件,則返回
if (fd.getFile() == null)
return;
//保存了所選文件的名稱及其全路徑名稱已被稍后使用
//同時(shí)設(shè)置當(dāng)前文件夾路徑
selcectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selcectfile;
//將用戶選擇的文件作為一個(gè)菜單項(xiàng)加入播放列表該菜單項(xiàng)"名為"該文件名;
//被點(diǎn)擊后給出的命令串是該文件的全路徑名
MenuItem mi = new MenuItem(selcectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
//程序邏輯運(yùn)行到此表示用戶選擇了一個(gè)"播放列表"中的媒體文件
//此時(shí)可以通過(guò)如下動(dòng)作獲得該文件的全路徑名;
cufile = e.getActionCommand();
selcectfile = cufile;
}
//如果已存在一個(gè)播放器,則先將其關(guān)閉,稍后重新創(chuàng)建
//創(chuàng)建播放器時(shí)需要捕捉一些異常;
if (player != null)
player.close();
try {
player = Manager.createPlayer(new MediaLocator("file:" + cufile));
} catch (java.io.IOException 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(selcectfile);
//設(shè)置處理播放控制器實(shí)際的對(duì)象;
player.addControllerListener(this);
player.prefetch();
}
//因?yàn)閷?shí)現(xiàn)了"ControllerListener"接口,本方法用于處理媒體播放器傳來(lái)的事件;
public void controllerUpdate(ControllerEvent e) {
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;
}
return;
}
//在播放結(jié)束時(shí),將播放指針置為文件之首,如果設(shè)定了循環(huán)播放,則再次啟動(dòng)播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
//PrefetchCompleteEvent事件發(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;
}
}
}
//菜單狀態(tài)改變事件的響應(yīng)函數(shù);
public void itemStateChanged(ItemEvent e) {
loop = !loop;
}
//不執(zhí)行背景清除操作,以免控制面板部件閃爍
//同時(shí)使得本程序在用鼠標(biāo)拖動(dòng)窗口時(shí)存在一些沒(méi)有及時(shí)重繪的情況,有待改進(jìn)
public void update(Graphics g) {
paint(g);
}
//本類的main函數(shù),其中構(gòu)造了本類的一個(gè)實(shí)例;
public static void main(String[] args) {
new MediaPlayer("簡(jiǎn)單媒體播放器");
}
public void paint(Graphics g) {
// 調(diào)用超類Frame的paint()方法,該paint()方法將調(diào)用Frame包含的各個(gè)容器
// 和部件(包括控制面板部件)的paint()方法。
super.paint(g);
//以下代碼實(shí)現(xiàn)了在開(kāi)啟程序之初顯示歡迎界面
if (first) {
int w = getSize().width;
int h = getSize().height;
g.setColor(Color.magenta);
g.fillRect(0, 0, w, h);
Font f = new Font("DialogInput", Font.BOLD, 18);
g.setFont(f);
FontMetrics fm = g.getFontMetrics();
int swidth = fm.stringWidth(" 簡(jiǎn)單媒體播放器 ");
g.setColor(Color.white);
g.drawString(
" 簡(jiǎn)單媒體播放器 ",
(w - swidth) / 2,
(h + getInsets().top) / 2);
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -