Java MP3 player
/ /包名
进口java.io.BufferedReader;
进口java.io.File;
进口java.io.FileNotFoundException;
进口java.io.FileReader;
进口java.io.IOException;
进口java.util.Iterator;
进口java.awt.BorderLayout;
进口java.awt.FileDialog;
进口java.awt.Container;
进口java.awt.GridLayout;
进口java.awt.List;
进口java.awt.TextArea;
进口java.awt.event.ActionEvent;
进口java.awt.event.ActionListener;
进口java.awt.event.MouseAdapter;
进口java.awt.event.MouseEvent;
进口java.awt.event.WindowAdapter;
进口java.awt.event.WindowEvent;
进口javax.sound.sampled.AudioFormat;
进口javax.sound.sampled.AudioInputStream;
进口javax.sound.sampled.AudioSystem;
进口javax.sound.sampled.DataLine;
进口javax.sound.sampled.SourceDataLine;
进口javax.swing。*;
公开课MusicPlayer延伸JFrame {
私有静态最终长serialVersionUID l = 1;
布尔isStop = true;/ /控制播放线程
布尔hasStop = true;/ /播放线程状态String filepath. / / play
the file directory
The String filename. / / play the file name
AudioInputStream AudioInputStream. / / audio file flow
AudioFormat AudioFormat; / / audio file format
SourceDataLine SourceDataLine; / / interface: source data row, which can be written to audio data
List the List; / / list
JLabel labelfilepath; / / playback directory display tags
JLabel labelfilename; / / playback file display tags
TextArea TextArea.
JMenuBar menubar;
JMenu menufile;
JMenuItem menuopenmany;
JMenuItem menuopensong;
JPanel panelmain;
The Container Container;
JPanel paneright;
JTextField textField.
JTextField lyricsJTextField;
The Container container2;
Static int testtimethread;
TimeThread TimeThread;
Public MusicPlayer () {
/ / set the form properties
This is the new BorderLayout ().
SetTitle (" music player ");
This.setsize (800, 300);
/ / create a menu bar
Menubar = new JMenuBar ();
Menufile = new JMenu (" file ");
Menuopenmany = new JMenuItem (" open folder ");
Menuopensong = new JMenuItem (" turn on the song ");
Menufile. Add (menuopenmany);menufile.add(menuopensong);
menubar.add(menufile);
this.setVisible(真正的);
this.setJMenuBar(菜单条);
menuopenmany。addActionListener(新ActionListener(){
公共空间actionPerformed(ActionEvent e){
openlist();
}
});
menuopensong。addActionListener(新ActionListener(){
公共空间actionPerformed(ActionEvent e){
openone();
}
});
/ /文件列表
列表= new();
列表。addMouseListener(新MouseAdapter(){
公共空间mouseClicked(MouseEvent e){
/ /双击时处理
如果(e.getClickCount()= = 2){
/ /播放选中的文件
文件名= list.getSelectedItem();
testtimethread + +;
如果(testtimethread ! = 1){
timeThread.testrunning = false;
}
showlyrics();
玩();
}
}
});
/ /信息显示
panelmain = new JPanel(新GridLayout(2,1));
容器= new容器();
容器。setLayout(新GridLayout(1、2);
这一点。add(panelmain BorderLayout.NORTH);
这一点。添加(容器,BorderLayout.CENTER);
labelfilepath = new JLabel(“播放目录:”);
labelfilename = new JLabel(“播放文件:”);
panelmain.add(labelfilepath);
panelmain.add(labelfilename);
textField = new JTextField();
textArea = new textArea();
textArea.enableInputMethods(假);
paneright = new JPanel();
lyricsJTextField = new JTextField();
paneright。setLayout(新BorderLayout());
paneright。add(文本框,BorderLayout.NORTH);
paneright。add(文本区域,BorderLayout.CENTER);
paneright.add(lyricsJTextField BorderLayout.SOUTH);
/ / container.add(文本区域,BorderLayout.EAST);
container.add(列表);
container.add(paneright);
/ /注册窗体关闭事件
这一点。addWindowListener(新WindowAdapter(){
公共空间windowClosing(WindowEvent e){
system . exit(0);
}
});
this.setVisible(真正的);
}
/ /打开文件列表
私人空间openlist(){
FileChoose选择者= new FileChoose();
/ / DIRECTORIES_ONLY就是只选目录
选择器。
setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int r = chooser.showOpenDialog(空);
字符串aString = " \ \ ";
如果(chooser.getSelectedFile().toString()= = null){
JOptionPane。showMessageDialog(零,“未选择任何文件”);
}
其他的
{
.toString filepath = chooser.getSelectedFile()()+ aString;
labelfilepath。setText(“播放目录:“+ filepath);
/ /显示文件列表
/ / list.removeAll();
文件filedir =新文件(filepath);
文件[]文件列表= filedir.listFiles();
for(int i = 0;我<文件列表。长度;我+ +){
String[]filenamelist =新的字符串(filelist.length);
filenamelist[我]=文件列表(我). getname().toLowerCase();
如果(filenamelist[我].endsWith(mp3)
| | filenamelist[我].endsWith(wav)){
list.add(filenamelist[我]);
}
}
}
}
/ /打开单个文件
私人空间openone(){
FileDialog dialog1 = new FileDialog(这个,”选择音乐文
件”,FileDialog.LOAD);
dialog1.setVisible(真正的);
filepath = dialog1。getDirectory();
字符串文件名= dialog1.getFile();
如果(!(filename.endsWith(mp3)| | filename.endsWith(wav))){
JOptionPane。showMessageDialog(零,“文件选择错误”);
system . exit(0);
}
如果(filepath != null){
labelfilepath。setText(“播放目录”+ filepath);
list.add(文件名);
}
}
私人空间showlyrics(){
char[]数组= filename.toCharArray();
int k = array.length;
而(数组(k - 1)! = '。'){
k,;
}
字符串lyricsname =新的字符串(数组、0 k - 1);
尝试{
文件lyricsfile =新文件(filepath + lyricsname +“.lrc”);
FileReader FileReader = new FileReader(lyricsfile);
BufferedReader BufferedReader = new
BufferedReader(fileReader);
timeThread = new timeThread(lyricsfile lyricsJTextField);
timeThread.start();
字符串记录;
textField.setText(“开始播放:“+文件名);
textArea.setText(" ");
在((记录= bufferedReader.readLine())! = null){
textArea.append(记录);
textArea.append(“\ n”);
}
}捕捉(FileNotFoundException e){The textArea. SetText (" no
lyrics ");
}
Catch (IOException e2) {
/ / TODO: handle exception
E2. PrintStackTrace ();
}
}
/ / play
Private void play () {
Try {
IsStop = true; / / stop the playing thread
/ / wait for the playback thread to stop
While (! HasStop) {
/ / system.out.print (". ")
Try {
Thread.sleep (10);
} catch (Exception e) {
}
}
File File = new File (filepath + filename);
Labelfilename.settext (" play file: "+ filename);
/ / get the file input stream
AudioInputStream = audiosystem.getaudioinputstream (file);
AudioFormat = audioinputstream.getformat ();
If (audioFormat. GetEncoding ()! = audioFormat. Encoding.
PCM_SIGNED) {/ / Encoding does not meet the default requirement
/ / define new file formats,
AudioFormat = new audioFormat (audioFormat.)
AudioFormat. GetSampleRate (), 16,
AudioFormat. GetChannels (),
AudioFormat. GetChannels () * 2,
AudioFormat. GetSampleRate (), false);/ / using new file formats and audio input streams to construct new audio input streams
AudioInputStream = audiosystem.getaudioinputstream (audioFormat,
AudioInputStream);
}
/ / construct data rows
DataLine. Info dataLineInfo = new datale.info
SourceDataLine. Class, audioFormat,
AudioSystem. NOT_SPECIFIED);
SourceDataLine = (sourceDataLine) audiosystem.getline (dataLineInfo); / / read the data line to the source data line
SourceDataLine. Open (audioFormat);
SourceDataLine. Start (); / / allow the source data line operation (I/O) to be done
/ / create an independent thread to play
IsStop = false;
Thread playThread = new playThread ()
PlayThread. Start ();
} catch (Exception e) {
E.p rintStackTrace (); / / output to standard error flow
}
}
Public static void main (String args [])
New MusicPlayer ();
}
/ / playback thread
The class PlayThread extends Thread {
Byte tempBuffer [] = new byte [320]
Public void run () {
Try {
Int CNT.
HasStop = false;
/ / read data to cache data
While (CNT = audioInputStream).Read (tempBuffer, 0,
TempBuffer length))! = -1) {/ / test whether to the end of
the stream
If (isStop)
Break;
If (CNT > 0) {
/ / write the cached audio data to the mixer
SourceDataLine.
Labelfilename.settext (" play file: "+ filename);
}
}
/ / Block waits for temporary data to be output empty
SourceDataLine. Drain () tapping;
SourceDataLine. Close (); / / close line
HasStop = true;
} catch (Exception e) {
E.p rintStackTrace ();
System. The exit (0);
}
}
}
}
/ / another class
Import the Java. IO. BufferedReader;
Import the Java. IO. The File;
Import the Java. IO. FileNotFoundException;
Import the Java. IO. FileReader;
Import the Java. IO. IOException;
The import javax.mail. Swing. JTextField;
The class TimeThread extends Thread {
/ / TODO auto-generated constructor stub
BufferedReader reader;
JTextField textField.
String aString;
String bString;
Char [] a;
Char [] b;
The File File;
Int delaya delayb;
Boolean testrunning;
Public TimeThread (File File,JTextField textField){
这一点。文件=文件;
这一点。textField =文本框;
testrunning = true;
delaya = 0;
尝试{
FileReader FileReader = new FileReader(文件);
读者= new BufferedReader(fileReader);
}捕捉(FileNotFoundException e){
textField.setText(“找不到歌词文件”);
}
/ / TODO自动生成构造函数存根
}
公共空间run(){
尝试{
(,){
aString = reader.readLine();
一个= aString.toCharArray();
如果(aString.length()> = 10){
如果([0]= = '(')& &([3]= = ':')& &([9]= =)))休息;
}
}
textField.setText(" ");
一个= aString.toCharArray();
delaya =([8],' 0 ')* 10 +([7],' 0 ')* 100 +([5],' 0 ')* 1000
+([4],' 0 ')* 10000 +([2],' 0 ')* 60000 +([1],' 0 ')* 600000;
睡眠(delaya);
char[]aelse = new char[a.length-10];
for(int i = 0;我< a.length-10;+ +){
aelse[我]=(i + 10);
}
字符串temp =新的字符串(aelse 0 aelse.length);
textField.setText(临时);
而(testrunning&&((型= reader.readLine()))!= null){
一个= aString.toCharArray();
delaya =([8],' 0 ')* 10 +([7],' 0 ')* 100 +([5],' 0 ')* 1000
+([4],' 0 ')* 10000 +([2],' 0 ')* 60000 +([1],' 0 ')* 600000;
b = bString.toCharArray();
delayb =(b[8]-“0”)* 10 +(b[7]-“0”)* 100 +(b[5]-“0”)*
1000 +(b[4]-“0”)* 10000 +(b[2]-“0”)* 60000 +(b[1]-“0”)*
600000;
睡眠(delayb-delaya);
char[]belse = new char[b.length-10];
for(int i = 0;我< b。10,我+ +){
belse[我]= b(i + 10);
}
字符串temp1 =新的字符串(belse 0 belse.length);
textField.setText(temp1);
aString =型;
}
reader.close();
}捕捉(IOException e){
System.out.println(“输入输出异常”);
}
抓住(InterruptedException e){
System.out.println(“线程异常中断”);
}
/ / catch(InterruptedException e2){
/ / TODO:处理异常
}
/ /测试是否是歌词的句子
}
/ /有一个类
进口javax.swing.JFileChooser;
进口javax.swing.JOptionPane;
类FileChoose延伸JFileChooser {
公共空间cancelSelection(){JOptionPane. ShowMessageDialog
(null, "no files selected");
}
}