2015-06-10 3 views
4

У меня есть код с 2 классами MPlayer и Audio.пауза аудио клип в java

У MPlayer есть графический интерфейс (JButtons, JPanel и JFrame и т. Д.), А у Audio есть код для воспроизведения звука.
Проблема заключается в том, что я вызываю метод паузы в классе MPlayer, это не приостанавливает звук.

Может ли кто-нибудь помочь мне с этим?

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

на данный момент я просто играю короткие длины .wav-файлы. – Masu

+0

Я голосую, чтобы закрыть этот вопрос не по теме, потому что запросил OP. – zx8754

+0

Я никогда не делал этого, если бы позволил мне правильно его отредактировать. Но, к сожалению, я не могу его отредактировать – Masu

ответ

1

Вы делаете все, что в том же потоке. Приложения Swing начинаются с того, что называется Thread Dispatch Thread - это поток, который обрабатывает все взаимодействия с пользовательским интерфейсом. Вы не должны выполнять длительные задачи (например, воспроизведение звука) в этом потоке.

Создайте новую тему, чтобы воспроизвести аудио, и я думаю, вы найдете, что все работает лучше. Вы можете сделать это вручную, или вы можете использовать что-то вроде SwingWorker, чтобы сделать это, что позволит вам регулярно сообщать о «прогрессе» вашей игры (т. Е. Вы можете сказать, что вы X% сделали с файлом и т. Д., Или что осталось 3 м25 и т. д.).

Документация по классам для SwingWorker неплоха, и я настоятельно рекомендую вам прочитать ее, независимо от того, собираетесь ли вы ее использовать, поскольку в ней есть очень хорошие предложения для потоков в Swing в целом.