gpt4 book ai didi

Java - 如何停止另一个类的音频剪辑

转载 作者:行者123 更新时间:2023-11-30 03:43:49 25 4
gpt4 key购买 nike

现在,我正在制作一个涉及背景音频的应用程序,并且通过其他人的问题和答案中的一些提示,我能够使音频正常工作。

但现在,我正在尝试使用不同类中的按钮来停止在另一个类中实例化的音频剪辑。

当我测试原型(prototype)时,所有的原型(prototype)都在同一个类中,它运行得很好。

但在我的主应用程序中,“停止”按钮位于不同的类中(有充分的理由)。我不知道您是否需要我的主应用程序代码,但这是我描述的原型(prototype):任何帮助将不胜感激,谢谢。

public class AudioPlay  {

Clip clip;

// Constructor
public AudioPlay() {
try {
this.clip = AudioSystem.getClip();
} catch (LineUnavailableException ex) {
Logger.getLogger(AudioPlay.class.getName()).log(Level.SEVERE, null, ex);
}

JFrame f = new JFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setTitle("Test Sound Clip");
f.setSize(300, 200);
f.setLayout(new FlowLayout());

JButton button = new JButton("play");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
playSound(0);
}
});

JButton button2 = new JButton("stop");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clip.stop();
}
});

f.add(button);
f.add(button2);
f.setVisible(true);

}

public void playSound(int a){

// Open an audio input stream.
String[] sounds = new String[10];
sounds[0]= "/audioplay/sounds/kk.wav";
sounds[1]= "/audioplay/sounds/btn2.wav";
try {
URL url = this.getClass().getResource(sounds[a]);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);

// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();

} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}

}

public static void main(String[] args) {
new AudioPlay();
}
}

编辑这是实际的应用首先是主类............

public class Operator {
static boolean player = false;
Clip clip;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {

// TODO code application logic here
Welcome on = new Welcome();
on.setLocationRelativeTo(null);
on.setVisible(true);


}

public Operator() {
try {
this.clip = AudioSystem.getClip();
} catch (LineUnavailableException ex) {
Logger.getLogger(Operator.class.getName()).log(Level.SEVERE, null, ex);
}

}


public void playBackground(int a){
String[] sounds = new String[10];
sounds[0]= "/operator/sounds/kk.wav";
sounds[1]= "/operator/sounds/mnt5.wav";

try {
// Open an audio input stream.
URL url= this.getClass().getResource(sounds[a]);

AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
// Get a sound clip resource.

// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
}
}

}

接下来是声音开始播放的地方

public class MainMenuTest extends javax.swing.JPanel {

// this is for referencing
Operator sound = new Operator();
static int course;
static String courseName;

//constructor obviously..........
public MainMenuTest() {

initComponents();
}





public javax.swing.JPanel jPanel1;


@SuppressWarnings("unchecked")

private void initComponents() {

jPanel1 = new javax.swing.JPanel();



sound.playBackground(0);
/* writing this stop() action here below, causes the audio not to play, which is actually
what i want, but in another class
sound.clip.stop();
*/
//most of the components are removed, they weren't really relevant


}


}

最后,剪辑停止的类

public final class Options extends JPanel {
// referencing stuff
Operator sound = new Operator();
private JButton Start;


public Options() {
initComponents();

}


@SuppressWarnings("unchecked")

private void initComponents() {


Stop = new javax.swing.JButton("stop");



Stop.addActionListener(new ActionListener() {
public void stopActionPerformed(ActionEvent e) {
//this looks like the same stop() method wrote before, but here, it ain't working
sound.clip.stop();


}});

}





}

最佳答案

正如猜测的那样,从评论中你制作了额外的新对象。制造一个新物体就像拥有一个双胞胎。让双胞胎中的一个停止说话不会影响另一个......

运算符(operator)声音 = new Operator();//在你的代码中这应该只完成一次。

仅在主方法中执行此操作,并且其他类需要此方法在构造函数中接受此操作或使用 spring 或其他依赖注入(inject)。

一个简单的示例:

package play;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.JButton;
import javax.swing.JFrame;

public class AudioPlay {

private Clip clip;
JFrame f = new JFrame();
// Constructor
public AudioPlay() {
try {
this.clip = AudioSystem.getClip();
} catch (LineUnavailableException ex) {
Logger.getLogger(AudioPlay.class.getName()).log(Level.SEVERE, null, ex);
}



f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setTitle("Test Sound Clip");
f.setSize(300, 200);
f.setLayout(new FlowLayout());

JButton button = new JButton("play");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
playSound(0);
}
});



f.add(button);

//f.setVisible(true);

}

public void stopSound() {
clip.stop();
//clip.flush();
clip.close();

}

public void playSound(int a){

// Open an audio input stream.
String[] sounds = new String[10];
sounds[0]= "rs/Tr-3L_nA_sus_mf_D4.wav";
sounds[1]= "rs/Tr-3L_nA_sus_mf_F#4.wav";
File f = new File(sounds[a]);
try {
URL url = f.toURI().toURL();
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);

// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();

} catch (Exception e) {
e.printStackTrace();
System.out.println(e + " " + f);
}

}

public static void main(String[] args) {
AudioPlay ap = new AudioPlay();
Other oth = new Other(ap, ap.f);
ap.shw();
}

public void shw(){
f.setVisible(true);
}
}

//和

package play;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Other {

private AudioPlay au;
private JButton btnStop;

public Other(AudioPlay aupl, JFrame f){
this.au = aupl;
btnStop = new JButton("Stop");
f.add(btnStop);
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
au.stopSound();
}


});
}

}

这里了解其他如何接受对音频播放类的引用。并且音频播放类仅创建一次(新)。

仅供引用:不适用于此,但总的来说:如果我们需要旧对象或者旧对象有其他用途,我们确实希望创建一个新对象。示例一个数据传输对象,其中一个与 id = 1 的实体相关,另一个具有标识 2,我们在 HashMap 或其他集合中跟踪它们。

此外,在网络应用程序中,我们还有 session 和 request 范围 - 但这超出了本示例。对于这个示例,主要的事情是在 UI 中,我们通常只需要每个类的 1 个实例,并且不同的类需要相同的实例来进行通信。一个类在与实例 2 对话时不能与实例 1 对话,并期望实例 1 执行某些操作。

关于Java - 如何停止另一个类的音频剪辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235848/

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