gpt4 book ai didi

java - 第二次按下 J 按钮后尝试停止播放 wav 文件,但它不会停止

转载 作者:行者123 更新时间:2023-12-01 16:49:19 25 4
gpt4 key购买 nike

当用户按下按钮时,程序应该播放 Fitnessgram 起搏器测试。第二次按下该按钮,音频就会停止。再次按下按钮后,程序应再次从头开始播放测试。这是我的代码:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.net.URL;
import javax.sound.sampled.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class aMeme extends JFrame implements ActionListener{
public JButton button;
public boolean check;
public boolean audio;

public void paint(Graphics g){
if (check == true){
BufferedImage img = null;
try{
img = ImageIO.read(newFile("C:/Users/kebrobst18/Downloads/Fitnessgram.png"));
} catch (IOException e){
}
g.drawImage(img, 0, 0, this);
}
}

public void start(){
setLayout(new BorderLayout());
button=new JButton();
button.setPreferredSize(new Dimension(200, 100));
button.setText("Start/Stop");
button.addActionListener(this);
add(button, BorderLayout.SOUTH);
setSize(500,500);
setVisible(true);
audio = false;
}

public void actionPerformed(ActionEvent e){
check = true;
repaint();
try{
URL fg = new URL("http://sendeyo.com/up/8658f011a4c712b5da42f74af77729fe.wav");
Clip fitness = AudioSystem.getClip();
AudioInputStream gram = AudioSystem.getAudioInputStream(fg);
fitness.open(gram);
if (audio == false){
fitness.start();
audio = true;
} else if (audio == true){
fitness.stop();
audio = false;
}
} catch (LineUnavailableException f){
}
catch (UnsupportedAudioFileException | IOException f) {
}
}

public static void main(String args[]){
aMeme x = new aMeme();
x.start();
}
}

最佳答案

您的音频对象是 ActionPerformed 方法的本地对象。当第二次按下按钮时,创建全新的音频对象,并且对它们调用停止根本不会产生任何有益的效果,因为您没有停止当前正在播放的音频对象。将重要的音频对象放入类的实例字段中。特别是,fitness变量需要成为一个实例字段。

<小时/>

其他不相关但重要的问题根据我的评论:

  • 再次强调,今后请改进您发布的代码的格式以提高可读性
  • 不要将 catch block 留空,至少打印堆栈跟踪。否则你就是盲目的。
  • 不要在 JFrame 的 Paint 方法中进行绘制,也不要在绘画方法中遗漏 super 调用。而是在 JPanel 的paintComponent 方法中进行绘制,并在其第一行调用 super 的paintComponent 方法,
  • 切勿从绘画方法中读取文件,因为这是不必要的,并且会影响程序的感知响应能力。
  • 使用完资源后将其关闭。

关于java - 第二次按下 J 按钮后尝试停止播放 wav 文件,但它不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43742929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com