我有一个包含2个类MPlayer和Audio的代码。
MPlayer有GUI(JButtons,JPanel和JFrame等),Audio有代码播放音频。
问题是当我在类MPlayer中调用pause方法时,它不会暂停音频。
有人可以帮我吗?
MPlayer.java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MPlayer extends JFrame implements ActionListener {
ImageIcon icon1, icon2, icon3, icon4;
JPanel pan1;
JFrame frame;
JMenuBar bar;
JMenu menu;
JMenuItem menuItem;
JButton btn1, btn2;
public void initGUI() {
bar = new JMenuBar();
menu = new JMenu("Open");
bar.add(menu);
menuItem = new JMenuItem("Open");
menu.add(menuItem);
BorderLayout bl = new BorderLayout();
FlowLayout fl = new FlowLayout();
pan1 = new JPanel();
frame = new JFrame("Music Player");
frame.setLayout(bl);
pan1.setLayout(fl);
frame.setJMenuBar(bar);
icon1 = new ImageIcon("./play.jpg");
icon2 = new ImageIcon("./pause.png");
icon3 = new ImageIcon("./stop.jpg");
icon4 = new ImageIcon("./wallpaper.jpg");
frame.getContentPane().setBackground(Color.BLACK);
btn1 = new JButton(icon1);
btn1.setVisible(true);
btn2 = new JButton(icon3);
btn2.setVisible(true);
pan1.add(btn1);
pan1.add(btn2);
frame.add(new JLabel(icon4), BorderLayout.CENTER);
frame.add(pan1, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setFocusable(true);
btn1.addActionListener(this);
menuItem.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
Audio aud = new Audio();
if (e.getSource() instanceof JMenuItem) {
if (((JMenuItem) (e.getSource())) == menuItem) {
aud.openFile();
}
}
if (btn1.getIcon() == icon1) {
btn1.setIcon(icon2);
aud.pause();
} else if (btn1.getIcon() == icon2) {
btn1.setIcon(icon1);
}
}
public static void main(String[] args) {
MPlayer gui = new MPlayer();
gui.initGUI();
}
}
Audio.java:
import javax.sound.sampled.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Audio {
File file;
AudioInputStream audio;
AudioFormat fmt;
DataLine.Info dli;
Clip c;
JFileChooser jfc;
public void openFile() {
try {
jfc = new JFileChooser();
jfc.showOpenDialog(null);
file = jfc.getSelectedFile();
audio = AudioSystem.getAudioInputStream(file);
fmt = audio.getFormat();
dli = new DataLine.Info(Clip.class, fmt);
c = (Clip) AudioSystem.getLine(dli);
c = AudioSystem.getClip();
c.open(audio);
c.start();
} catch (Exception ex) {
ex.getMessage();
}
}
public void pause() {
if (c.isRunning()) {
c.stop();
}
}
}
答案 0 :(得分:1)
你正在同一个线程中做所有事情。 Swing应用程序从所谓的Event Dispatch Thread开始 - 这是处理所有UI交互的线程。你不应该在这个帖子中执行长时间运行的任务(比如播放音频)。
产生一个新线程播放音频,我认为你会发现事情更好。您可以手动执行此操作,也可以使用SwingWorker之类的功能执行此操作,这样您就可以定期获得有关“进展”的反馈。你的演奏(也就是说你可以说你已经完成X%的文件等,或者剩下3m25等)。
SwingWorker的类文档相当不错,我强烈建议您阅读它,无论您是否打算使用它,因为它对Swing中的线程提供了一些非常好的建议。