我创建了一个在调用时启动或停止音乐的方法,但是如果我不止一次调用它,它就会启动一个重复的剪辑。我无法找到如何使音频剪辑变量之外的变量,以防止这种情况。
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if(play=true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play=false) {
clip.stop();
}
}更新:因此,经过几个小时的尝试,我决定将启动音乐的代码放在主方法中,使剪辑变量保持静态(所以允许我在事件中使用它),然后在事件中使用clip.stop()。只是想和你分享一下。
发布于 2022-05-30 00:57:48
除了更完整的答案,让声明读起来像
if(play)
{
// Play code
}
else
{
clip.stop();
}而不是
if(play == true)
{
// Play code
}
else if(play == false)
{
clip.stop();
}更好的风格。
编辑以获取附加信息
为了回答问题的标题,
如何在方法之外制作剪辑?
我相信你是在问如何格式化一个类级变量。这需要以下几点:
使用用于此调用的类:Clip clip = AudioSystem.getClip();,您可以使用以下方法创建空的类级变量:
private static Object objectName; 链接
发布于 2022-05-29 21:55:37
您当前的问题是if(play=true) {,这是将play设置为true,因此每次都会重新打开剪辑并开始播放。
您应该使用if(play==true) {来确定play的值是否为true,但也可以使用if(play) {
有关更多细节,请查看如果-然后和如果-然后-否则语句。。
本质上,=是用于赋值的,==是用于评估的。if条件必须等同于布尔值(true/false),因此当使用布尔值时,不必使用==,只需使用值本身即可。
假设play是true,if (play == true)和if (play)都将计算为true。
话虽如此,一旦你的剪辑初始化和打开,你不需要重新打开它,当你想再次开始播放,例如.
public class Track {
private Clip clip;
private File source;
public Track(File source) {
this.source = source;
}
public static void playSound(boolean play) throws Exception {
File sound = new File("wave.wav");
Clip clip = AudioSystem.getClip();
if (play = true) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
inputStream = AudioSystem.getAudioInputStream(sound);
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} else if (play = false) {
clip.stop();
}
}
public File getSource() {
return source;
}
public Clip getClip() {
return clip;
}
public void play() throws LineUnavailableException, UnsupportedAudioFileException, IOException {
if (clip == null) {
AudioInputStream inputStream = AudioSystem.getAudioInputStream(getSource());
inputStream = AudioSystem.getAudioInputStream(getSource());
}
if (!clip.isOpen()) {
clip.open();
}
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
}
public void stop() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
clip.setFramePosition(0);
}
}实际上,您还可以通过执行以下操作轻松地添加对暂停的支持
public void pause() {
if (clip == null) {
return;
}
if (!clip.isActive()) {
return;
}
clip.stop();
}(ps -我没有添加一个封闭的方法,这也会非常有用)
https://stackoverflow.com/questions/72427441
复制相似问题