——MP3文件工程的創建和源代碼 html
作完上面1的全部步驟以後,說明你已經把JMF的環境配置完畢,接下來咱們就能夠進行MP3的java文件的編寫了。 java
首先咱們先創建一個java Projet文件 ios
而後在java Project文件中創建一個文件夾,可是這個文件夾不是普通的文件夾(普通文件夾只用來存放數據或文件),而是須要創建一個【Source Folder】文件夾,該文件夾能夠對內部文件進行編譯和處理,咱們所要編寫的MP3文件就須要放在該文件夾下面。 數組
在此我特別說幾個注意事項: 網絡
(1)、咱們建立MediaPlayer的時候,它對應的包爲:importjavax.media.bean.playerbean.MediaPlayer;可是該包不會自動的導入,因此這個包必須咱們手動添加,否則會報程序錯誤 多線程
(2)咱們須要驗證一下咱們導入的JMF包和環境配置是否成功, oracle
咱們發如今 ide
已經導入和jmf.jar和sound.jar ui
(3)JMF沒有內置的MP3播放的插件,須要根據oracle官網上的說明安裝這個才能使用。 this
JMF並不包含對MP3文件的解碼,咱們要播放MP3文件,就須要一個MP3的解碼器,而這個解碼器咱們能夠下載,大小隻有幾十KB,咱們在【百度】搜索【JMF MP3 Plugin】,如圖:
咱們選擇第二個,點擊打開以下頁面:
咱們點擊【DownLoad】進行相關下載。
或者在:http://www.pudn.com/downloads565/sourcecode/java/detail2326572.html進行下載
JMF MP3 Plugin該插件下載後,直接把該文件放在JDK的目錄下便可。
下面是源代碼:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.media.ControllerEvent;
import javax.media.MediaLocator;
import javax.media.RealizeCompleteEvent;
import javax.media.bean.playerbean.MediaPlayer;
public class cuiPM3 {
private static final long serialVersionUID = 1L; // 序列化,爲了實現網絡傳輸
private static MediaPlayer MyPlayer;
private static String filename = "d:\\和你同樣.mp3";
private static JFrame framePlay = null;
private static JPanel panelPlay = null;
private static JPanel panelList = null;
private static JList listPlay = null;
private static Vector vectorPlay = null;
private static JMenuBar menuBar=null;
private static JSplitPane SplitPanel=null;
private static ActionListener openFile = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
FileDialog fd = new FileDialog(framePlay, "選擇歌曲", FileDialog.LOAD); // 打開選擇文件的選擇框,提示框名爲"選個歌曲",
// this表明主類
fd.setVisible(true); // 顯示選擇框
filename = fd.getDirectory() + fd.getFile(); // 文件名稱=獲取此文件對話框的目錄+文件名
System.out.println(filename);
if (filename.equals("")) {
return;
} else if (filename.equals("nullnull")) {
return;
}
boolean j = false;
for (int i = 0; i < vectorPlay.size(); i++) {
if (vectorPlay.get(i).toString().equals(filename)) {// 若是數組裏面的數據和文件名同樣,則直接結束不添加
j = true;
break;
}
}
if (j == false) {
vectorPlay.add(filename); // 將文件名添加至動態數組裏面
listPlay.setListData(vectorPlay); // 列表框的數據添加動態數組
}
}
};
private static ActionListener closeFile = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
};
private static ActionListener playMusic = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
play();
}
};
private static ActionListener stopMusic = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
stop();
}
};
public cuiPM3() {
initialize();// 初始狀態
}
private void initialize() {
// TODO Auto-generated method stub
}
protected static void play() {
// TODO Auto-generated method stub
try {
if (filename.equals("")) {
return;
}
if (MyPlayer == null) {
MyPlayer = new MediaPlayer();
} else {
closePreviosPlayer();
}
MyPlayer.setMediaLocator(new MediaLocator("file:///" + filename)); //創建一個播放器的定位時間
//MyPlayer.addControllerListener(framePlay);
MyPlayer.realize(); //
MyPlayer.start(); // 開始播放歌曲
} catch (Exception e) {
}
}
private static void closePreviosPlayer() {
// TODO Auto-generated method stub
if (MyPlayer == null)
return;
MyPlayer.stop();
MyPlayer.deallocate(); // 中止播放而且從新裝載DateSource
Component visual = MyPlayer.getVisualComponent(); /*
* player.getVisualComponent
* ()是一個播放全部視頻媒體的可視組件。
*/
Component control = MyPlayer.getControlPanelComponent(); /*
* player.
* getControlPanelComponent
* (
* )是一個操做時間軸的但是組建
* ,
* 也包含了一些媒體的其餘信息
* 。
*/
if (visual != null) {
panelPlay.remove(visual);
}
if (control != null) {
panelPlay.remove(control);
}
}
protected static void stop() {
// TODO Auto-generated method stub
MyPlayer.stop();
MyPlayer.deallocate();
}
/*
public synchronized void controllerUpdate(ControllerEvent event) { // Player狀態控制
if (event instanceof RealizeCompleteEvent) {
Component comp;
if ((comp = MyPlayer.getControlPanelComponent()) != null) { // 操做時間軸不爲空,就將其添加在面板最低端
panelPlay.add("South", comp);
} else {
closePreviosPlayer();
}
if ((comp = MyPlayer.getVisualComponent()) != null) { // 可視化面板不爲空就將其添加至居中
panelPlay.add("Center", comp);
}
validate();
}
}
*/
private void validate() {
// TODO Auto-generated method stub
}
private static MouseListener mouseAction=new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if (e.getClickCount() == 1) { // getClickCount鼠標監聽事件,若是鼠標單擊一次
String str = (String) listPlay.getSelectedValue();
if (str == null) {
return;
}
filename = str;
//System.out.println(str);// 若是單擊一次則輸出在他的歌曲名稱
}
if (e.getClickCount() == 2) { // 若是鼠標單擊兩次
String str = (String) listPlay.getSelectedValue(); // str接受鼠標選取的列表框中的值
if (str == null) {// 若是爲空,怎麼什麼都不作,不然開始播放str接受的歌曲
return;
}
filename = str;
play();
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
};
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { //個匿名內部類,runnable()是應用在多線程中的。它的實例化就默認調用了一個run()方法。
public void run() {
framePlay = new JFrame("我本身的MP3播放器");
framePlay.setBounds(200, 100, 1100, 580);
framePlay.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
framePlay.setResizable(false);// 將最大化按鈕的做用取消
panelPlay = new JPanel(); // 建立一個左面的播放面板
panelList = new JPanel(); // 建立一個右面的列表面板
ImageIcon image=new ImageIcon("image/beijing.jpg");
JLabel labelImage=new JLabel(image);
panelPlay.add(labelImage,BorderLayout.WEST);
SplitPanel = new JSplitPane();// 建立一個可分割的面板,用於將面板分爲一左一右兩個面板
SplitPanel.setDividerSize(5); // 設置分格條的大小
SplitPanel.setResizeWeight(0.01); // 設置分割的比例
SplitPanel.setEnabled(false); //固定分割條不可左右
SplitPanel.setRightComponent(panelList); // 爲分割的右面板添加播放列表面板
SplitPanel.setLeftComponent(panelPlay); // 爲分割的左面板添加播放面板
listPlay = new JList(); // 定義一個列表框
listPlay.addMouseListener(mouseAction);
JLabel labelList=new JLabel("播放列表");
panelList.add(labelList,BorderLayout.NORTH);
vectorPlay = new Vector(); // 定義一個動態數組,用於接受咱們添加的歌曲的列表
panelList.add(listPlay);// 將列表框添加至列表面板
menuBar = new JMenuBar(); // 定義一個空白的菜單條
JMenu menu = new JMenu("文件"); // 定義一個文件的菜單組件
JMenu menu2 = new JMenu("操做"); // 定義一個保存的菜單組件
menuBar.add(menu);
menuBar.add(menu2);
JMenuItem menuItem = new JMenuItem("打開文件··"); // 定義一個"打開文件··"的菜單項
menuItem.addActionListener(openFile);
JMenuItem menuItem2 = new JMenuItem("關閉程序 "); // 定義一個"關閉程序"的菜單項
menuItem2.addActionListener(closeFile);
JMenuItem menuItem3 = new JMenuItem("播放"); // 定義一個"播放"的菜單項
menuItem3.addActionListener(playMusic);
JMenuItem menuItem4 = new JMenuItem("中止"); // 定義一個"中止"的菜單項
menuItem4.addActionListener(stopMusic);
// 爲"文件"菜單組添加"打開文件··"和"關閉程序"兩個菜單項
menu.add(menuItem);
menu.add(menuItem2);
// 爲"操做"菜單組添加"播放"和"中止"這兩個菜單項
menu2.add(menuItem3);
menu2.add(menuItem4);
framePlay.setJMenuBar(menuBar); // 將菜單條添加至頂層容器中
framePlay.add(SplitPanel);
framePlay.setVisible(true);
}
});
}
}
效果如圖所示: