关于AudioClip
Applet 能通过使用 java.applet 包中的 AudioClip 接口播放音频
public void play(): 从一开始播放音频片段一次。 直到要播放音频文件时,该文件才会下载下来。
public void loop(): 循环播放音频片段
public void stop(): 停止播放音频片段
以下代码演示了最简单的Java播放音乐
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
public class MusicPlayer {
private static AudioClip adc;// 声音音频剪辑对象
public static void main(String[] args) {
play("山外小楼夜听雨.wav");
}
public static void play(String songName) {
try {
URL url = new URL("file:" + JdbcUtils.musicPath + songName);//JdbcUtils.musicPath:歌曲的存放路径
adc = Applet.newAudioClip(url);
adc.play();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public static void stop(){
adc.stop();
}
}
用javaswing实现音乐播放器功能
部分代码
public class Mp3 extends JFrame {
/**
* 只支持wav | au | aif | aifc | snd 格式 不支持mp3
*/
private static final String PATH_URL = "D:\\codeying\\"; //音乐路径
/**
* 支持类型
*/
private static final String[] SUPPORT_TYPE = new String[]{"wav", "au", "aif", "aifc", "snd"};
/**
* 文件集合
* k 文件 v也是文件. 方便查找.
*/
public static Map<String, Object> MAP_COLLECTION = new HashMap<>();
private JPanel contentPane;
File file;// 声明文件对象
//当前播放的是第几个
int index;
String filename;
String ss = "";
String flag = "";
String tt = "";
@SuppressWarnings("rawtypes")
Vector vt = new Vector();
JFileChooser chooser = new JFileChooser();// 创建一个文件选择器
private JTextField xiaoxi;
boolean loop = false;
AudioClip adc;// 声音音频剪辑对象
SourceDataLine line;
private FloatControl volume = null;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Mp3 frame = new Mp3();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public String getmusic(String path) throws Exception {
File rootDir = new File(path);
String[] fileList = rootDir.list();
if (!rootDir.isDirectory()) {
String type = "mp3";
String st = "";
if (type.equals(
rootDir.getName().substring(rootDir.getName().lastIndexOf(".") + 1, rootDir.getName().length()))) {
st = rootDir.getName().substring(0, rootDir.getName().lastIndexOf("."));
System.out.println(st);
ss += st + "\n";
}
} else {
for (int i = 0; i < fileList.length; i++) {
path = rootDir.getAbsolutePath() + "\\" + fileList[i];
getmusic(path);
}
}
return null;
}
/**
* Create the frame.
*/
public Mp3() {
setResizable(false);
setFont(new Font("微软雅黑", Font.PLAIN, 12));
//主题
setTitle("音乐播放器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 364, 478);
JScrollPane scrollPane = new JScrollPane();
JSlider slider = new JSlider();
//获取文件
String[] fileName = getFileName(PATH_URL, new ArrayList<>());
if (fileName.length == 0) {
System.out.println("未找到数据");
return;
}
JList songlist = new JList(fileName);
//鼠标事件(按下、释放、单击、进入或离开)的侦听器接口
songlist.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (adc != null)
adc.stop();
try {
URL url;
flag = (String) songlist.getSelectedValue();
tt = flag;
url = new URL("file:" + MAP_COLLECTION.get(tt));
adc = Applet.newAudioClip(url);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 创建资源定
if (e.getClickCount() == 2) {
flag = "正在播放:" + flag;
xiaoxi.setText(flag);
adc.play();
}
}
});
songlist.setFont(new Font("微软雅黑", Font.PLAIN, 12));
scrollPane.setViewportView(songlist);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnNewMenu = new JMenu("菜单");
mnNewMenu.setFont(new Font("微软雅黑", Font.PLAIN, 12));
menuBar.add(mnNewMenu);
xiaoxi = new JTextField();
xiaoxi.setEditable(false);
xiaoxi.setFont(new Font("微软雅黑", Font.PLAIN, 12));
xiaoxi.setColumns(10);
xiaoxi.setText("欢迎使用本播放器");
JMenuItem dakai = new JMenuItem("打开");
dakai.setFont(new Font("微软雅黑", Font.PLAIN, 12));
dakai.addActionListener(new ActionListener() {
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent e) {
int value = chooser.showOpenDialog(chooser);// 接受文件选择器的状态
if (value == chooser.APPROVE_OPTION) {
file = chooser.getSelectedFile();// 返回选中文件
filename = file.getName();
String flag = filename;
xiaoxi.setText(flag);
try {
if (adc != null)
adc.stop();
URL url = new URL("file:" + file.getPath());// 创建资源定位
adc = Applet.newAudioClip(url);
//adc.play();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("不能播放!");
}
}
}
});
mnNewMenu.add(dakai);
JMenuItem tuichu = new JMenuItem("退出");
tuichu.setFont(new Font("微软雅黑", Font.PLAIN, 12));
tuichu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
if (adc != null)
adc.stop();
return;
}
});
JMenuItem saomiao = new JMenuItem("扫描本地音乐");
saomiao.addActionListener(new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
String path = PATH_URL;
ss = "";
try {
getmusic(path);
String[] split = ss.split("\n");
for (int i = 0; i < split.length; i++) {
vt.addElement(split[i]);
songlist.setListData(vt);
}
} catch (Exception ee) {
System.out.println("there is wrong!");
}
}
});
saomiao.setFont(new Font("微软雅黑", Font.PLAIN, 12));
mnNewMenu.add(saomiao);
mnNewMenu.add(tuichu);
//子区域
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
JButton playbtn = new JButton("播放");
playbtn.setFont(new Font("微软雅黑", Font.PLAIN, 12));
playbtn.setHorizontalAlignment(SwingConstants.LEFT);
playbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (adc != null) adc.stop();
if (filename != null)
flag = "正在播放:" + filename;
else
flag = "正在播放:" + tt;
if (adc == null) {
flag = "请选择播放的音乐";
xiaoxi.setText(flag);
return;
}
adc.play();
xiaoxi.setText(flag);
}
});
JButton stopbtn = new JButton("暂停");
stopbtn.setFont(new Font("微软雅黑", Font.PLAIN, 12));
stopbtn.setHorizontalAlignment(SwingConstants.LEFT);
stopbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (adc != null) adc.stop();
if (filename != null)
flag = "停止播放音乐:" + filename;
else
flag = "停止播放音乐:" + tt;
xiaoxi.setText(flag);
}
});
JButton againbtn = new JButton("循环");
againbtn.setFont(new Font("微软雅黑", Font.PLAIN, 12));
againbtn.setHorizontalAlignment(SwingConstants.LEFT);
againbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loop = !loop;
flag = "";
if (loop) {
if (adc != null) adc.play();
if (adc != null) adc.loop();// 循环播放
if (filename != null)
flag = "循环播放音乐:" + filename;
else
flag = "循环播放音乐:" + tt;
} else {
if (adc != null) adc.play();
if (filename != null)
flag = "顺序播放音乐:" + filename;
else
flag = "顺序播放音乐:" + tt;
}
xiaoxi.setText(flag);
}
});
//上一曲
JButton lastbtn = new JButton("上一曲");
lastbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (adc != null) adc.stop();
index = songlist.getSelectedIndex();
if (index > 0) {
try {
URL url;
songlist.setSelectedIndex(index - 1);
flag = (String) songlist.getSelectedValue();
tt = flag;
System.out.println("正在播放:" + flag);
url = new URL("file:" + MAP_COLLECTION.get(tt));
flag = "正在播放:" + flag;
xiaoxi.setText(flag);
adc = Applet.newAudioClip(url);
adc.play();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
lastbtn.setFont(new Font("微软雅黑", Font.PLAIN, 12));
//下一曲
JButton nextbtn = new JButton("下一曲");
nextbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (adc != null) adc.stop();
index = songlist.getSelectedIndex();
if (index >= 0) {
try {
URL url;
songlist.setSelectedIndex(index + 1);
flag = (String) songlist.getSelectedValue();
tt = flag;
System.out.println("正在播放:" + flag);
url = new URL("file:" + MAP_COLLECTION.get(tt));
flag = "正在播放:" + flag;
xiaoxi.setText(flag);
adc = Applet.newAudioClip(url);
adc.play();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
nextbtn.setFont(new Font("微软雅黑", Font.PLAIN, 12));
GroupLayout gl_contentPane = new GroupLayout(contentPane);
//设置定位和调整大小 沿水平轴的组件 不推荐调整
gl_contentPane
.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup().addContainerGap()
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 372,
Short.MAX_VALUE)
.addComponent(xiaoxi, GroupLayout.DEFAULT_SIZE, 372, Short.MAX_VALUE)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(playbtn, GroupLayout.PREFERRED_SIZE, 64,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED, 66, Short.MAX_VALUE)
.addComponent(stopbtn, GroupLayout.PREFERRED_SIZE, 66,
GroupLayout.PREFERRED_SIZE)
.addGap(58).addComponent(againbtn, GroupLayout.PREFERRED_SIZE, 64,
GroupLayout.PREFERRED_SIZE))
.addComponent(slider, GroupLayout.DEFAULT_SIZE, 372, Short.MAX_VALUE)
.addGroup(gl_contentPane.createSequentialGroup().addComponent(lastbtn)
.addPreferredGap(ComponentPlacement.RELATED, 132, Short.MAX_VALUE)
.addComponent(nextbtn))).addContainerGap()));
//设置定位和调整大小 沿垂直轴的组件 不推荐调整
gl_contentPane
.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.TRAILING)
.addGroup(
gl_contentPane.createSequentialGroup()
.addComponent(xiaoxi, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lastbtn).addComponent(nextbtn))
.addPreferredGap(ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
.addComponent(slider, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE).addGap(18)
.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 258, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE).addComponent(playbtn)
.addComponent(againbtn).addComponent(stopbtn)).addContainerGap()));
contentPane.setLayout(gl_contentPane);
}
/**
* 工具方法:递归获取文件夹filePath中的数据,MAP_COLLECTION填充
*/
private static String[] getFileName(String filePath, List<String> objects) {
System.out.println("扫描"+filePath);
}
}