java - 在JFrame窗口的背景中播放音乐

标签 java audio jframe audio-streaming

我试图在“框架”窗口的背景中播放音频文件,但发现添加一个图片要复杂得多。

我找到了一个应该如何添加音乐的“教程”,它看起来相当简单,至少在所需的代码量方面。但是,我无法播放音频文件,它说了两件事...

1st-我试图播放复制到我的java项目中的音频文件,这告诉我找不到该文件或目录。

2-我给该方法提供了一个音频文件的路径,它告诉我...

could not get audio input stream from input file

请记住,我是一个新手,本教程并没有提供太多帮助,所以我不知道此播放方法实际上在做什么。我很想学习如何做到这一点,但是对于该项目,我所见过的一切都过于复杂,而且我没有时间投入,因为没有必要仅添加一点点技巧。

任何帮助是极大的赞赏!!我在有问题的代码周围加了星号。
public MultiForm() {
    super("Multi Form Program");        
    setLayout(new FlowLayout());
    menu = new JComboBox(fileName);
    add(menu);

    /*How to add a background image to the Menu.
     * add(new JLabel(new ImageIcon(getClass().getResource("MatrixPIC.png"))));
     */

    TheHandler handler = new TheHandler();
    menu.addItemListener(handler);  
}

public void matrixPanel() {

    TheHandler handler = new TheHandler();
    //Create a new window when "The Matrix" is clicked in the JCB
    newFrame = new JFrame();
    panel = new JPanel();
    panel2 = new JPanel();

    newFrame.setLayout(new FlowLayout());
    newFrame.setSize(500, 300);
    newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);      

    matrixQuote = new JLabel("<html><center>After this, there is no turning back. "
            + "<br><center>You take the blue pill—the story ends, you wake up "
            + "<br><center>in your bed and believe whatever you want to believe."
            + "<br><center>You take the red pill—you stay in Wonderland, and I show"
            + "<br><center>you how deep the rabbit hole goes. "
            + "<br><center>Remember: all I'm offering is the truth. Nothing more.</html>");

    panel.add(matrixQuote);
    newFrame.add(panel, BorderLayout.NORTH);

    //Blue pill button and picture. 
    Icon bp = new ImageIcon(getClass().getResource("Blue Pill.png"));
    bluePill = new JButton("Blue Pill", bp);
    panel2.add(bluePill);   
    bluePill.addActionListener(handler);

    //Red pill button and picture
    Icon rp = new ImageIcon(getClass().getResource("Red Pill.png"));
    redPill = new JButton("Red Pill", rp);
    panel2.add(redPill);

    newFrame.add(panel2, BorderLayout.CENTER);      
    newFrame.setVisible(true);
}

*********************************************************************************
public void play(String path, int delay, int numberOfLoops) {
    for(int i = 0; i < numberOfLoops; i++) {
        new Thread() {
            @Override
            public void run() {
                try {
                    File file = new File(path);
                    Clip clip = AudioSystem.getClip();
                    clip.open(AudioSystem.getAudioInputStream(file));
                    clip.start();
                    Thread.sleep(clip.getMicrosecondLength());

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }.start();
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
*********************************************************************************        

private class TheHandler implements ItemListener, ActionListener{

    public void itemStateChanged(ItemEvent IE) {
        //listen for an item to be selected.
        if(IE.getStateChange() == ItemEvent.SELECTED) {
            Object selection = menu.getSelectedItem();

            if("The Matrix".equals(selection)) {
                matrixPanel();
            }
            else if("Another Option".equals(selection)) {   
            }
        }   
    }


    public void actionPerformed(ActionEvent AE) {
        if(AE.getSource() == bluePill) {
            //Clear panels after button is clicked.
            newFrame.remove(panel);         
            newFrame.remove(panel2);
            newFrame.repaint();
    *********************************************************************************       
            play("/Users/SWD/Downloads/fail.mp3", 10, 30);
 *********************************************************************************  
            newFrame.setSize(600, 400);
            bpPanelLabel = new JPanel();
            bpLabel = new JLabel("<html><center>WELCOME TO THE BEGINING OF YOUR NEW LIFE!  " +
                     "<br><center>YOU'RE ABOUT TO SEE HOW DEEP THE RABBIT HOLE GOES!</html>");
            newFrame.add(bpLabel);
            newFrame.add(bpPanelLabel, BorderLayout.NORTH);
            bpPanelPic = new JPanel();
            newFrame.add(new JLabel(new ImageIcon(getClass().getResource("MatrixPIC.png"))));
            newFrame.add(bpPanelPic, BorderLayout.CENTER);  
            newFrame.validate();
        }


    }   
}


//Main method sets up the main JFrame with the menu
public static void main(String[] args) {

    MultiForm go = new MultiForm();
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    go.setSize(400, 200);
    go.setVisible(true);
}
}

最佳答案

  • Java的音频API不支持(全部)mp3编码。如果您需要播放mp3,则应该看看JavaZoom's JLayer API
  • 如果您要播放的文件位于项目的src(或Jar文件中的扩展名)内,则需要使用Class#getResourceClass#getResourceAsStream代替
  • Clip自动支持自身的循环,因此您不需要使用自己的循环,因为这可能会阻塞事件调度线程。
  • Thread似乎有点扼杀恕我直言,尽管您仍然可以使用它来添加人为延迟,但在我的示例中我使用了Swing Timer,因为它更简单:P

  • 例如
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.IOException;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.UnsupportedAudioFileException;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JTextField;
    import javax.swing.SpinnerNumberModel;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.filechooser.FileFilter;
    
    public class JavaApplication5 {
    
        public static void main(String[] args) {
            new JavaApplication5();
        }
    
        public JavaApplication5() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private Clip clip = null;
    
            private JTextField audioFile;
            private JButton browse;
            private JSpinner loops;
            private JSpinner delay;
            private JFileChooser chooser;
    
            public TestPane() {
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                add(new JLabel("Audio File:"), gbc);
    
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.weightx = 1;
                gbc.gridx++;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                gbc.anchor = GridBagConstraints.WEST;
                audioFile = new JTextField(20);
                add(audioFile);
    
                gbc.gridwidth = 1;
                gbc.weightx = 0;
                gbc.gridx++;
                browse = new JButton("...");
                add(browse, gbc);
    
                gbc.gridx = 0;
                gbc.gridy++;
                add(new JLabel("Loops: "), gbc);
    
                loops = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
                gbc.gridx++;
                gbc.fill = GridBagConstraints.NONE;
                add(loops, gbc);
    
                gbc.gridx = 0;
                gbc.gridy++;
                add(new JLabel("Delay (seconds): "), gbc);
    
                delay = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
                gbc.gridx++;
                gbc.fill = GridBagConstraints.NONE;
                add(delay, gbc);
    
                gbc.anchor = GridBagConstraints.CENTER;
                gbc.gridx = 0;
                gbc.gridy++;
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                JButton play = new JButton("Play");
                add(play, gbc);
    
                play.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            play(
                                            audioFile.getText(),
                                            (int) delay.getValue(),
                                            (int) loops.getValue());
                        } catch (LineUnavailableException | IOException | UnsupportedAudioFileException ex) {
                            ex.printStackTrace();;
                            JOptionPane.showMessageDialog(TestPane.this, "<html>Failed to play audio file:</br>" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
    
                browse.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (chooser == null) {
                            chooser = new JFileChooser();
                            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                            chooser.setMultiSelectionEnabled(false);
                            chooser.addChoosableFileFilter(new FileFilter() {
                                @Override
                                public boolean accept(File f) {
                                    System.out.println(f);
                                    return f.getName().toLowerCase().endsWith(".wav");
                                }
    
                                @Override
                                public String getDescription() {
                                    return "Wave Files (.wav)";
                                }
                            });
                        }
    
                        if (chooser.showOpenDialog(TestPane.this) == JFileChooser.APPROVE_OPTION) {
                            File selected = chooser.getSelectedFile();
                            audioFile.setText(selected.getPath());
                        }
                    }
                });
    
            }
    
            public void play(String path, int delay, int numberOfLoops) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
                if (clip != null) {
                    clip.stop();
                    clip = null;
                }
    
                if (delay > 0) {
                    System.out.println("Start with delay");
                    Timer timer = new Timer(delay * 1000, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            try {
                                play(path, numberOfLoops);
                            } catch (UnsupportedAudioFileException | LineUnavailableException | IOException ex) {
                                ex.printStackTrace();;
                                JOptionPane.showMessageDialog(TestPane.this, "<html>Failed to play audio file:</br>" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                            }
                        }
                    });
                    timer.setRepeats(false);
                    timer.start();
                } else {
                    play(path, numberOfLoops);
                }
            }
    
            private void play(String path, int numberOfLoops) throws UnsupportedAudioFileException, LineUnavailableException, IOException {
                File file = new File(path);
                if (file.exists()) {
                    clip = AudioSystem.getClip();
                    clip.open(AudioSystem.getAudioInputStream(file));
                    clip.start();
                }
            }
        }
    
    }
    

    关于java - 在JFrame窗口的背景中播放音乐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791646/

    相关文章:

    java - Maven如何根据平台配置更改依赖版本(MySQL)

    java - LayoutParams 上的 ClassCastException 从 LinearLayout 到 AbsListView

    c# - 从 C# 中的 Filter Graph Manager 获取接口(interface)

    ios - 使用 AVPlayer 播放音频在后台不起作用

    java - JFrame 等待数据接收以执行其任务

    java - 当我单击 JButton 时,JFrame 组件如何消失?

    java - hadoop mapreduce 中的重复项

    java - 异步消息传递和微服务

    ios - 尝试在 Garageband 中使用已发布的应用间音频应用程序时出错

    java - 向 jframe 添加更多容器