📄 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);
//创建按钮面板
JPanel buttonPane=new JPanel();
buttonPane.add(oneB);
buttonPane.add(allB);
buttonPane.add(stopB);
//设置右侧面板为网格包布局
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);
//插入右侧分隔面板
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); //创建后台进程
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); //设置表格当前行选中
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(;;){ //无限循环,直到每一歌曲播放完毕。
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循环前面,否则会被最后的歌曲覆盖。
temp.add(new Integer(i)); //序号
temp.add(songVector.get(i)); //歌曲名
rowData.add(temp);
}
//设置水平和垂直滚动条
this.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//
dtm = new DefaultTableModel(rowData,columnName){
//修改下面方法的返回值为false,使表格单元数据只读。
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();
//为行选择模式添加行选择监听器
dlsm.addListSelectionListener(this);
jTableView.setSelectionModel(dlsm); //设置表格的行选择模式
}
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 + -