Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序挂起停止音频_Java - Fatal编程技术网

Java程序挂起停止音频

Java程序挂起停止音频,java,Java,我为一个简单的音乐播放器编写了这段代码,问题是当我单击openLabel打开一首歌曲,然后单击playLabel暂停时,程序停止执行(程序挂起) 您正在调用screenThread.suspend()。线程方法suspend()和resume()容易发生死锁-也就是说,使用它们通常会导致难以诊断的问题,比如您遇到的问题 您需要通过轮询变量来取消这些方法的使用,如中所述 此方法已被弃用,因为它天生容易死锁 这就是不推荐使用线程.stop()、挂起()和恢复()的原因。当您在代码中使用这些代码时,可

我为一个简单的音乐播放器编写了这段代码,问题是当我单击openLabel打开一首歌曲,然后单击playLabel暂停时,程序停止执行(程序挂起)


您正在调用
screenThread.suspend()。线程方法
suspend()
resume()
容易发生死锁-也就是说,使用它们通常会导致难以诊断的问题,比如您遇到的问题

您需要通过轮询变量来取消这些方法的使用,如中所述

此方法已被弃用,因为它天生容易死锁


这就是不推荐使用
线程.stop()
挂起()
恢复()
的原因。当您在代码中使用这些代码时,可能会出现问题。

…有任何异常或其他情况吗?你试过调试它,看看它卡在哪里了吗?我会先把那条线去掉,看看会发生什么。
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.Random;
import javax.sound.sampled.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;  

public class A extends MouseAdapter implements ChangeListener, Runnable {
    private ImageIcon playImage = new ImageIcon(getClass().getResource("Images/play.png"));
    private ImageIcon pauseImage = new ImageIcon(getClass().getResource("Images/pause.png"));
    private ImageIcon openImage = new ImageIcon(getClass().getResource("Images/open.png"));
    private JLabel playLabel = new JLabel(playImage);
    private JLabel openLabel = new JLabel(openImage);
    public JFrame frame = new JFrame();
    public JPanel colorPanel = new JPanel();
    private enum Status {ON,OFF,PAUSE,END};
    private Status playStatus=Status.OFF;
    private JSlider slider = new JSlider();
    public Clip songClip;   
    Thread screenThread = new Thread(this);

    public static void main(String arg[]) throws Exception {
        new A();
    }

    public A() throws Exception {
        setFrame();
        setComponents();
    }

    public void setFrame() {
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.setCursor(new Cursor(Cursor.HAND_CURSOR));
        frame.getContentPane().setBackground(Color.BLACK);
        frame.setVisible(true);
    }

    public void setComponents() {
        slider.setBounds(0,640,1000,15);
        slider.setBackground(Color.BLACK);
        slider.addChangeListener(this);
        slider.setValue(0);
        playLabel.setBounds(450,665,100,100);
        playLabel.addMouseListener(this);
        openLabel.setBounds(540,690,60,60);
        openLabel.addMouseListener(this);
        colorPanel.setBackground(Color.BLACK);
        colorPanel.setBounds(0,100,1500,500);
        frame.add(openLabel);
        frame.add(playLabel);
        frame.add(colorPanel);
        frame.add(slider);
    }

    public void mouseClicked(MouseEvent clicked) {
        if (clicked.getSource() == openLabel) {
            openLabel.setIcon(openImage);
            open();
        }
        else if (clicked.getSource()==playLabel && playStatus != Status.OFF) {
            if (playStatus == Status.PAUSE) {
                songClip.start();
                screenThread.resume();
                playStatus=Status.ON;
                playLabel.setIcon(pauseImage);
            }
            else if (playStatus == Status.ON) {
                songClip.stop();
                screenThread.suspend();
                playStatus=Status.PAUSE;
                playLabel.setIcon(playImage);
            }
            else if (playStatus==Status.END) {
                songClip.setMicrosecondPosition(0);
                slider.setValue(0);
                songClip.start();
                screenThread.resume();
                playStatus = Status.ON;
                playLabel.setIcon(pauseImage);
            }
        }
    }

    public void stateChanged(ChangeEvent e) {
        if (playStatus != Status.OFF) {
            JSlider jslider = (JSlider)e.getSource();
            int position = jslider.getValue();
            songClip.setMicrosecondPosition(position * 1000000);
        }
    }

    public void open() {
        JFileChooser chooseSong = new JFileChooser();
        chooseSong.setFileSelectionMode(JFileChooser.FILES_ONLY);
        chooseSong.setFileFilter(new FileNameExtensionFilter(null, "wav"));
        int chooseButton = chooseSong.showOpenDialog(null);
        File songPath = chooseSong.getSelectedFile();

        if ( (chooseButton!=JFileChooser.CANCEL_OPTION) && (songPath!=null) && (songPath.getName() != null) ) {
            try {
                playLabel.setIcon(pauseImage);
                if (playStatus != Status.OFF)
                    songClip.close();

                AudioInputStream songFile = AudioSystem.getAudioInputStream(songPath);
                songClip = AudioSystem.getClip();
                songClip.open(songFile);

                int clipLength = (int)(songClip.getMicrosecondLength() / 1000000);
                slider.setMinimum(0);
                slider.setMaximum(clipLength);
                songClip.start();

                if (playStatus == Status.OFF)
                    screenThread.start();
                else if (playStatus != Status.OFF)
                    screenThread.resume();

                playStatus=Status.ON;
            }
            catch(Exception exp) {
                Toolkit.getDefaultToolkit().beep();
                JOptionPane.showMessageDialog(null, String.format("ERROR = %s",exp.getClass()));
                System.exit(0);
            }
        }
    }

    public void run() {
        while (true) {
            colorPanel.setBackground(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));           
            if (songClip.getMicrosecondPosition() == songClip.getMicrosecondLength()) {
                screenThread.suspend();
                playStatus=Status.END;
                playLabel.setIcon(playImage);
            }
        }
    }
}