⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 internetmusic.java

📁 Java多线程实现的显示波形的Applet高级播放器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -