?? internetmusic.java
字號:
import javax.swing.JApplet;
import java.util.Vector;
import java.util.StringTokenizer;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.BasicStroke;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import java.io.IOException;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.URL;
public class InternetMusic extends JApplet implements ActionListener,Runnable{
Vector songVector=new Vector();
Vector songFileVector=new Vector();
JSplitPane jSplitPane1=new JSplitPane();
SongTablePane songTablePane;
Vector lines=new Vector();
AudioInputStream audioInputStream;
AudioFormat audioFormat;
final int bufferSize=16384;
WaveGraphPane waveGraphPane=new WaveGraphPane();
PlayMusic playMusic=new PlayMusic();
double seconds,duration;
URL url;
String selSong="未選擇";
String selSongFile=null;
JButton oneB=new JButton("單曲播放");
JButton allB=new JButton("全部播放");
JButton stopB=new JButton("停止");
Thread backThread; //播放全部歌曲的后臺線程
boolean stopStatus;
public void init(){
setSize(560,230);
String songs=getParameter("songs");
String songFiles=getParameter("songFiles");
//
StringTokenizer stk1=new StringTokenizer(songs,",");
while(stk1.hasMoreTokens()){
songVector.add(stk1.nextToken());
}
//
StringTokenizer stk2=new StringTokenizer(songFiles,",");
while(stk2.hasMoreTokens()){
songFileVector.add(stk2.nextToken());
}
songTablePane=new SongTablePane(songVector);
getContentPane().add(jSplitPane1);
jSplitPane1.setLeftComponent(songTablePane);
jSplitPane1.setDividerLocation(230);
//創(chuàng)建按鈕面板
JPanel buttonPane=new JPanel();
buttonPane.add(oneB);
buttonPane.add(allB);
buttonPane.add(stopB);
//設(shè)置右側(cè)面板為網(wǎng)格包布局
JPanel rightPane=new JPanel();
GridBagLayout gridbag = new GridBagLayout();
rightPane.setLayout(gridbag);
GridBagConstraints c = new GridBagConstraints();
//布置音頻曲線面板
c.gridx=0;
c.gridy=0;
c.weightx=100;
c.weighty=95;
c.fill=GridBagConstraints.BOTH;
gridbag.setConstraints(waveGraphPane,c);
rightPane.add(waveGraphPane);
//布置按鈕面板
c.gridx=0;
c.gridy=1;
c.weightx=100;
c.weighty=5;
c.fill=GridBagConstraints.BOTH;
gridbag.setConstraints(buttonPane,c);
rightPane.add(buttonPane);
//插入右側(cè)分隔面板
jSplitPane1.setRightComponent(rightPane);
//添加按鈕的單擊事件處理
oneB.addActionListener(this);
allB.addActionListener(this);
stopB.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
Object srcObj=e.getSource();
if(srcObj==oneB){
if(selSongFile!=null){
try{
//url=new URL("file:///d:/applet/music/"+selSongFile);
url=new URL("file://"+getCodeBase().getPath()+"/music/"+selSongFile);
audioInputStream=AudioSystem.getAudioInputStream(url);
//多少偵/貞頻率,再通過1000乘去,化為毫秒.
long milliseconds = (long)((audioInputStream.getFrameLength()*1000)/audioInputStream.getFormat().getFrameRate());
duration = milliseconds / 1000.0;
waveGraphPane.drawWaveLine(null); //繪制音頻曲線
playMusic.startPlay(); //播放
waveGraphPane.startDraw(); //移動紅線條
}catch(Exception e2){System.out.println(e2);}
}
}
if(srcObj==allB){
stopStatus=false;
backThread=new Thread(this); //創(chuàng)建后臺進程
backThread.start(); //啟動后臺線程播放所有歌曲
}
if(srcObj==stopB){
if(backThread!=null){
stopStatus=true;
playMusic.playThread=null;
waveGraphPane.graphThread=null;
backThread=null; //停止播放全部歌曲的后臺線程
}
else{
playMusic.stopPlay();
waveGraphPane.stopDraw();
}
}
}
//后臺運行全部歌曲
public void run(){
for(int i=0;i<songVector.size();i++){
if(!stopStatus){
selSong=(String)songVector.get(i);
String selSongFile=(String)songFileVector.get(i);
songTablePane.jTableView.changeSelection(i,0,false,false); //設(shè)置表格當前行選中
try{
//url=new URL("file:///d:/applet/music/"+selSongFile);
url=new URL("file://"+getCodeBase().getPath()+"/music/"+selSongFile);
audioInputStream=AudioSystem.getAudioInputStream(url);
//多少偵/貞頻率,再通過1000乘去,化為毫秒.
long milliseconds = (long)((audioInputStream.getFrameLength()*1000)/audioInputStream.getFormat().getFrameRate());
duration = milliseconds / 1000.0;
waveGraphPane.drawWaveLine(null); //繪制音頻曲線
playMusic.startPlay(); //播放
waveGraphPane.startDraw(); //移動紅線條
}catch(Exception e2){System.out.println(e2);}
for(;;){ //無限循環(huán),直到每一歌曲播放完畢。
if(playMusic.playThread==null) break;
}
}
}
backThread=null; //最后停止后臺線程
}
//歌曲點播面板
class SongTablePane extends JScrollPane implements ListSelectionListener{
JTable jTableView;
DefaultTableModel dtm;
int selRow;
SongTablePane(Vector songVector){
//表格的列頭標題
Vector columnName=new Vector();
columnName.add("序號");
columnName.add("歌曲");
//為歌曲加上序號
Vector rowData=new Vector();
for(int i=0;i<songVector.size();i++){
Vector temp=new Vector();//不要把此語句放在for循環(huán)前面,否則會被最后的歌曲覆蓋。
temp.add(new Integer(i)); //序號
temp.add(songVector.get(i)); //歌曲名
rowData.add(temp);
}
//設(shè)置水平和垂直滾動條
this.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//
dtm = new DefaultTableModel(rowData,columnName){
//修改下面方法的返回值為false,使表格單元數(shù)據(jù)只讀。
public boolean isCellEditable(int row, int col) {return false;}
};
jTableView=new JTable(dtm);
jTableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//預置"序號"列的寬度
TableColumn orderColumn = jTableView.getColumn("序號");
orderColumn.setPreferredWidth(60);
//預置"歌曲"列的寬度
TableColumn songColumn=jTableView.getColumn("歌曲");
songColumn.setPreferredWidth(210);
//把表格插入滾動條面板
this.getViewport().setView(jTableView);
//
DefaultListSelectionModel dlsm=new DefaultListSelectionModel();
//為行選擇模式添加行選擇監(jiān)聽器
dlsm.addListSelectionListener(this);
jTableView.setSelectionModel(dlsm); //設(shè)置表格的行選擇模式
}
public void valueChanged(ListSelectionEvent e){
//取得歌曲文件名
selRow=jTableView.getSelectedRow();
selSong=(String)songVector.get(selRow);
selSongFile=(String)songFileVector.get(selRow);
}
}
//播放音樂類
class PlayMusic implements Runnable {
SourceDataLine sdLine; //紅線條
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -