?? mediaplayer.java
字號:
//程序所用到的各種程序包
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;
//本程序對應的類;
class MediaPlayer
extends JFrame
implements ActionListener, ControllerListener, ItemListener {
//MediaPlayer類的變量成員的聲明;
//JMF提供的播放器對象;
Player player;
Component vc, cc, gcc;
GainControl gc;
//first值用來控制在剛開始程序時顯示一幅歡迎界面;loop用以標記是否循環播放;
boolean first = true, loop = false;
//設立一個字符串記錄當前打開文件的路徑
String currentDirectory;
MediaPlayer(String title) {
super(title);
// 利用一個adapter實現對用戶點擊窗口系統菜單的關閉按鈕
// 時的響應;
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
//調用dispose以執行windowClosed
dispose();
}
public void windowClosed(WindowEvent e) {
if (player != null)
player.close();
System.exit(0);
}
});
//調用設置程序菜單欄的方法成員完成菜單的布置
setupMenu();
setSize(400, 400);
setVisible(true);
}
//本方法用以設置程序菜單欄
public void setupMenu() {
//設置一個菜單
Menu f = new Menu("文件");
//往設置的菜單種添加菜單項
MenuItem mi = new MenuItem("打開");
mi.addActionListener(this);
f.add(mi);
f.addSeparator();
CheckboxMenuItem cbmi = new CheckboxMenuItem("循環", 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();
//設置一個菜單欄
MenuBar mb = new MenuBar();
//將設置的菜單依次加入程序的菜單欄中去
mb.add(f);
mb.add(c);
mb.add(l);
//將構造完成的菜單欄交給當前程序的窗口;
setMenuBar(mb);
}
//事件響應成員;捕捉發送到本對象的各種事件;
public void actionPerformed(ActionEvent e) {
//設一個字符串用于暫存打開的媒體文件的路徑;
String cufile , selcectfile;
if (e.getActionCommand().equals("退出")) {
// 調用dispose以便執行windowClosed
dispose();
return;
}
//次事件表明用戶選擇了"播放"菜單命令;
//如果當前有一個文件可以播放則執行播放命令;
if (e.getActionCommand().equals("播放")) {
if (player != null) {
player.start();
}
return;
}
//如果當前正在播放某一文件,則執行暫停;
if (e.getActionCommand().equals("暫停")) {
if (player != null) {
player.stop();
}
return;
}
//次事件表明用戶選擇了"播放"菜單命令;
//如果當前有一個文件可以播放則執行播放命令;
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.show();
// 如果用戶放棄選擇文件,則返回
if (fd.getFile() == null)
return;
//保存了所選文件的名稱及其全路徑名稱已被稍后使用
//同時設置當前文件夾路徑
selcectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selcectfile;
//將用戶選擇的文件作為一個菜單項加入播放列表該菜單項"名為"該文件名;
//被點擊后給出的命令串是該文件的全路徑名
MenuItem mi = new MenuItem(selcectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
//程序邏輯運行到此表示用戶選擇了一個"播放列表"中的媒體文件
//此時可以通過如下動作獲得該文件的全路徑名;
cufile = e.getActionCommand();
selcectfile = cufile;
}
//如果已存在一個播放器,則先將其關閉,稍后重新創建
//創建播放器時需要捕捉一些異常;
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("無法創建播放器.");
return;
}
first = false;
setTitle(selcectfile);
//設置處理播放控制器實際的對象;
player.addControllerListener(this);
player.prefetch();
}
//因為實現了"ControllerListener"接口,本方法用于處理媒體播放器傳來的事件;
public void controllerUpdate(ControllerEvent e) {
Container tainer = getContentPane();
// 調用player.close()時ControllerClosedEvent事件出現。
// 如果存在視覺部件,則該部件應該拆除(為一致起見,
// 我們對控制面板部件也執行同樣的操作下一次需要時再構造)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
return;
}
//在播放結束時,將播放指針置為文件之首,如果設定了循環播放,則再次啟動播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
//PrefetchCompleteEvent事件發生后調用start,正式啟動播放
if (e instanceof PrefetchCompleteEvent) {
player.start();
return;
}
//本事件表示由于用于播放的資源已經確定;此時要將媒體的圖形conmopnent
//(如果有)顯示出來,同時將播放器player的控制器顯示到窗口里;
if (e instanceof RealizeCompleteEvent) {
//如果媒體中有圖像,將對應圖像component載入窗體;
vc = player.getVisualComponent();
if (vc != null)
tainer.add(vc, BorderLayout.CENTER);
//將對應控制器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);
//根據媒體文件中是否有圖像,設定相應的窗口大小
if (vc != null) {
pack();
return;
} else {
setSize(300, 75);
setVisible(true);
return;
}
}
}
//菜單狀態改變事件的響應函數;
public void itemStateChanged(ItemEvent e) {
loop = !loop;
}
//不執行背景清除操作,以免控制面板部件閃爍
//同時使得本程序在用鼠標拖動窗口時存在一些沒有及時重繪的情況,有待改進
public void update(Graphics g) {
paint(g);
}
//本類的main函數,其中構造了本類的一個實例;
public static void main(String[] args) {
new MediaPlayer("簡單媒體播放器");
}
public void paint(Graphics g) {
// 調用超類Frame的paint()方法,該paint()方法將調用Frame包含的各個容器
// 和部件(包括控制面板部件)的paint()方法。
super.paint(g);
//以下代碼實現了在開啟程序之初顯示歡迎界面
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(" 簡單媒體播放器 ");
g.setColor(Color.white);
g.drawString(
" 簡單媒體播放器 ",
(w - swidth) / 2,
(h + getInsets().top) / 2);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -