在java中暂停音频剪辑

时间:2015-06-10 13:23:27

标签: java audio

我有一个包含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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你正在同一个线程中做所有事情。 Swing应用程序从所谓的Event Dispatch Thread开始 - 这是处理所有UI交互的线程。你不应该在这个帖子中执行长时间运行的任务(比如播放音频)。

产生一个新线程播放音频,我认为你会发现事情更好。您可以手动执行此操作,也可以使用SwingWorker之类的功能执行此操作,这样您就可以定期获得有关“进展”的反馈。你的演奏(也就是说你可以说你已经完成X%的文件等,或者剩下3m25等)。

SwingWorker的类文档相当不错,我强烈建议您阅读它,无论您是否打算使用它,因为它对Swing中的线程提供了一些非常好的建议。