我无法停止音乐
i have trouble stopping the music
我在使用以下代码时遇到问题;我创建了 2 classes:
import javax.sound.sampled.DataLine;
import javax.swing.JOptionPane;
public class Banger implements DataLine {
void playMusic(String musicLocation) {
try {
File musicPath = new File(musicLocation);
if (musicPath.exists()) {
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
Clip clip = AudioSystem.getClip();
clip.stop();
clip.open(audioInput);
clip.start();
clip.loop(clip.LOOP_CONTINUOUSLY);
}
else {
System.out.println("ERROR");
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
在这个 class 中,我正在尝试创建一个音乐播放器,并且效果很好。
public void mouseEntered(MouseEvent e) {
message6.setVisible(true);
options.setBackground(Color.YELLOW);
String filepath = "p.wav";
Banger musicObject = new Banger();
musicObject.playMusic(filepath);
}
public void mouseExited(MouseEvent e) {
message6.setVisible(false);
options.setBackground(new Color(0, 0, 0, 0));
Banger musicObject = new Banger();
String filepath = "p.wav";
clip.stop();
}
在这个 class 中,我尝试让一个按钮做一些事情,它起作用了,然后我尝试在我按下按钮时播放音乐,并在我关闭时停止它 - 它开始但不会停止
您在 mouseExited
中关闭的对象是 Banger
的一个新的单独实例,而不是您实例化的实例。
我推荐以下措施。
(1) 在播放和停止播放的class中为Banger
创建一个实例变量。
(2) 在 Banger 中,将构造函数与启动和停止 Clip
.
的各个方法分开
其他一些建议:
- 我看不出你是如何做任何需要
DataLine
的事情的,我会从你的 Banger
class.[=39= 中删除 implements DataLine
]
Clip
的loop
方法会开始播放,所以不需要start
方法。
快速重写 Banger:
public class Banger {
private Clip clip;
public Banger(String musicLocation) {
try {
File musicPath = new File(musicLocation);
if (musicPath.exists()) {
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
clip = AudioSystem.getClip();
clip.open(audioInput);
else {
System.out.println("ERROR");
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public void play() {
clip.setFramePosition(0);
clip.loop(clip.LOOP_CONTINUOUSLY);
}
public void stop() {
clip.stop();
}
}
现在,mouseEntered
和 mouseExited
应该访问同一个实例变量。
private Banger banger;
public void setBanger(String filepath) {
banger = new Banger(filepath);
}
public void mouseEntered(MouseEvent e) {
// some code omitted
banger.play();
}
// similar for mouseExited, calling banger.stop();
我在使用以下代码时遇到问题;我创建了 2 classes:
import javax.sound.sampled.DataLine;
import javax.swing.JOptionPane;
public class Banger implements DataLine {
void playMusic(String musicLocation) {
try {
File musicPath = new File(musicLocation);
if (musicPath.exists()) {
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
Clip clip = AudioSystem.getClip();
clip.stop();
clip.open(audioInput);
clip.start();
clip.loop(clip.LOOP_CONTINUOUSLY);
}
else {
System.out.println("ERROR");
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
在这个 class 中,我正在尝试创建一个音乐播放器,并且效果很好。
public void mouseEntered(MouseEvent e) {
message6.setVisible(true);
options.setBackground(Color.YELLOW);
String filepath = "p.wav";
Banger musicObject = new Banger();
musicObject.playMusic(filepath);
}
public void mouseExited(MouseEvent e) {
message6.setVisible(false);
options.setBackground(new Color(0, 0, 0, 0));
Banger musicObject = new Banger();
String filepath = "p.wav";
clip.stop();
}
在这个 class 中,我尝试让一个按钮做一些事情,它起作用了,然后我尝试在我按下按钮时播放音乐,并在我关闭时停止它 - 它开始但不会停止
您在 mouseExited
中关闭的对象是 Banger
的一个新的单独实例,而不是您实例化的实例。
我推荐以下措施。
(1) 在播放和停止播放的class中为Banger
创建一个实例变量。
(2) 在 Banger 中,将构造函数与启动和停止 Clip
.
其他一些建议:
- 我看不出你是如何做任何需要
DataLine
的事情的,我会从你的Banger
class.[=39= 中删除implements DataLine
] Clip
的loop
方法会开始播放,所以不需要start
方法。
快速重写 Banger:
public class Banger {
private Clip clip;
public Banger(String musicLocation) {
try {
File musicPath = new File(musicLocation);
if (musicPath.exists()) {
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
clip = AudioSystem.getClip();
clip.open(audioInput);
else {
System.out.println("ERROR");
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public void play() {
clip.setFramePosition(0);
clip.loop(clip.LOOP_CONTINUOUSLY);
}
public void stop() {
clip.stop();
}
}
现在,mouseEntered
和 mouseExited
应该访问同一个实例变量。
private Banger banger;
public void setBanger(String filepath) {
banger = new Banger(filepath);
}
public void mouseEntered(MouseEvent e) {
// some code omitted
banger.play();
}
// similar for mouseExited, calling banger.stop();