将声音添加到 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 恶作剧程序的主要内容,如果未能解决你的问题,请参考以下文章