将声音添加到 SoundBoard 恶作剧程序

Posted

技术标签:

【中文标题】将声音添加到 SoundBoard 恶作剧程序【英文标题】:Adding a Sound to SoundBoard Prank Program 【发布时间】:2021-11-09 01:23:44 【问题描述】:

当我使用 Java Eclipse 单击“播放”按钮时无法播放声音 我尝试了很多视频,但没有任何效果 我已经设置了项目,所以当您单击要使用的声音时打开一个带有播放、暂停和停止按钮的小窗口。我也在使用 Java WindowBuilder:Swing 设计器。图像的路径不是问题,因为我也使用了直接路径,但这也不起作用。我很困惑,因为我是编程新手,代码没有错误。

代码如下:

package com.dashboard.rickroll;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.Audiosystem;
import javax.sound.sampled.Clip;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class RickRoll 

    private JFrame frame;
    String RR;
    ButtonHandler bhandler = new ButtonHandler();
    RRSound RRS = new RRSound();

    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                try 
                    RickRoll window = new RickRoll();
                    window.frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
        
        new RickRoll();
    

    public RickRoll() 
        initialize();
    

    private void initialize() 
        frame = new JFrame();
        frame.setTitle("SoundBoard pre-Alpha v 0.01");
        frame.setBackground(Color.WHITE);
        frame.getContentPane().setBackground(Color.WHITE);
        frame.getContentPane().setLayout(null);
        
        JButton Playbtn = new JButton("Play");
        Playbtn.setBounds(10, 150, 60, 50);
        Playbtn.setFocusPainted(false);
        Playbtn.addActionListener(bhandler);
        frame.getContentPane().add(Playbtn);
        
        
        
        JLabel RickRollTtl = new JLabel("Rick Roll");
        RickRollTtl.setFont(new Font("Times New Roman", Font.PLAIN, 40));
        RickRollTtl.setBounds(66, 11, 168, 41);
        frame.getContentPane().add(RickRollTtl);
        
        
        
        JButton Pause = new JButton("Pause");
        Pause.setBounds(110, 150, 70, 50);
        frame.getContentPane().add(Pause);
        
        JButton Stop = new JButton("Stop");
        Stop.setBounds(224, 150, 60, 50);
        frame.getContentPane().add(Stop);
        frame.setSize(300,300);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        
        RR = ".//Sounds//RickRoll.wav";
        
    
    
    public class RRSound
        
        Clip clip;
        
        public void setFile(String soundFileName) 
                
            try 
                File RickRoll = new File(soundFileName);
                AudioInputStream sound = AudioSystem.getAudioInputStream(RickRoll);
                clip = AudioSystem.getClip();
                clip.open(sound);
             catch(Exception e) 
                
            
        
        public void play() 
            
            clip.setFramePosition(0);
            clip.start();
            
        
    
    
    public class ButtonHandler implements ActionListener
        
        public void actionPerformed(ActionEvent event) 
            
            RRS.setFile(RR);
            RRS.play();
            
        
        
    

    public void setVisible() 
    
        
    

每当我运行程序并单击播放时,我都会在控制台中收到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.dashboard.rickroll.RickRoll$RRSound.play(RickRoll.java:96)
    at com.dashboard.rickroll.RickRoll$ButtonHandler.actionPerformed(RickRoll.java:107)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

这能回答你的问题吗? What is a NullPointerException, and how do I fix it? 【参考方案1】:

如果您引用控制台中引用的行会很有帮助!计数并不容易,尤其是对于大文件和大空间(我认为它们在某些地方有 3 个空行,但不确定)。

下面是第 96 行吗?

        clip.setFramePosition(0);

如果调用了异常,则可以让 setFile() 方法中的 try/catch 打印调用堆栈。就目前而言,无法知道此代码块中是否发生异常。控制台消息说有一个 NPE,所以由于 clip 是该行上的唯一对象,clip 必须为空。这意味着在该引用变量的实例化中出现了问题。实例化发生在 try/catch 中。任何可能有帮助的诊断消息都会丢失。

因此e.printStackTrace(); 行至少应该包含在您的catch 代码块中。

我认为使用URL 作为参数通常比使用Form 作为AudioInputStream sound = AudioSystem.getAudioInputStream(RickRoll); 行更好

可以在 *** About Javasound 页面上看到这种用法的几个示例(使用 URL)。不幸的是,Clip 示例中使用的外部地址是死链接。但是,如果您有一个 wav 文件的有效 http 地址,这将起作用。但是,SourceDataLine 示例中用于实例化 AudioInputStream 的行仍然有效,并且可用于实例化 Clip 的 AudioInputStream 。请注意 cmets 中有关文件夹位置的信息!

如果您更改代码以遵循该规则(并将堆栈跟踪放入您的 catch 块中),但仍然遇到令人费解的错误,请随时使用新信息编辑/更新您的帖子。我们会尽力提供进一步的帮助。

顺便说一句,在命名变量时使用标准约定很重要。您应该以小写字母开头变量。大多数 Java 代码读者会倾向于认为,如果某事物以大写字母开头,那么它就是一个类名——所以如果不是这样,它可能会令人困惑。

【讨论】:

以上是关于将声音添加到 SoundBoard 恶作剧程序的主要内容,如果未能解决你的问题,请参考以下文章

在我的 SoundBoard 应用中播放 CustomSounds

小游戏系列——微型整蛊恶作剧

Matlab函数处理工作区恶作剧

基于MockingBird声音克隆

jQuery 跨域 POST 恶作剧

Java基础类中的恶作剧?