当前位置: 首页 > 知识库问答 >
问题:

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

谭学名
2023-03-14

我正在尝试在Frame窗口的背景中播放音频文件,我发现它比添加图片要复杂得多。

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

我试图播放一个我复制到我的java项目中的音频文件,它告诉我它找不到那个文件或目录。

第二-我给了这个方法一个音频文件的路径,它告诉我…

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);
}
}

共有1个答案

敖永丰
2023-03-14
  1. Java的音频API不支持(所有)mp3编码。如果你需要播放mp3,那么你应该看看JavaZoom的JLayer API
  2. 如果您尝试播放的文件在项目的src中(或扩展名的Jar文件),则需要使用class#get资源class#getResourceAsStream代替
  3. Clip自动支持自身循环,因此您不需要使用自己的循环,这可能会阻止事件调度线程。
  4. 线程似乎有点过分了,恕我直言,虽然您仍然可以使用一个来添加人工延迟,但我在我的示例中使用了SwingTimer,因为它更简单: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();
            }
        }
    }

}
 类似资料:
  • 在SetCompressor lzma后面加以下代码: ReserveFile "${NSISDIR}\Plugins\system.dll" ReserveFile "天鹅湖.mp3" 然后在 Section 区段后面加入 Function 区段: Function .onInit InitPluginsDir File "/oname=$PLUGINSDIR\bgm_天鹅湖.mp3"

  • 如何在外部媒体文件关闭后自动恢复音乐文件?

  • 本文向大家介绍C#播放背景音乐的方法小结,包括了C#播放背景音乐的方法小结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了C#播放背景音乐的方法。分享给大家供大家参考。具体分析如下: 最经在写winform程序,其中有用到播放背景音乐 特此收集了一些网上的教程: 1、调用非托管的dll 2、播放系统自带声音 3、使用System.Media.SoundPlayer播放wav 4、使用MCI

  • 问题内容: 我只是在写一个小型的python游戏,很有趣,我有一个函数可以开始叙述。 我正在尝试让音频在后台播放,但是很遗憾,在该功能继续之前,首先播放的是mp3文件。 我如何使其在后台运行? 另外,有什么方法可以控制播放声音模块的音量? 我应该补充一点,我使用的是Mac,但我不喜欢使用playsound,它似乎是我可以使用的唯一模块。 问题答案: 在Windows中: 使用 winsound.S

  • 我试图使用JavaFX创建一个游戏。我一直试图在游戏中插入一些背景音乐。音乐是兼容的. mp3文件。我目前正在使用来播放每个。每个媒体文件由实际循环和循环的小(可选)介绍音乐组成。如何使用JavaFX实现流畅的音频播放。 我尝试过的方法: > 使用作为一个文件;我尝试改变,。当我进入循环时,音乐的持续时间似乎缩短了。然而,音乐在介绍处重新开始,在错误的地方结束。就好像根本没有抵消音乐。 使用作为两

  • 问题内容: 有没有一种方法可以使用Tkinter在Python 3.x中创建“加载屏幕”?我的意思是像Adobe Photoshop的加载屏幕一样,具有透明度等。我设法摆脱已经使用的框架边框: 但是,如果我这样做: 图像显示正常,但背景为灰色而不是透明。 有没有一种方法可以增加窗口的透明度,但仍可以正确显示图像? 问题答案: 在tkinter中,没有跨平台的方法可以使背景透明。