Java 无法更改方法中的布尔值
我有个小问题。我正在使用Java声音采样播放mp3,我想在单击按钮时停止播放。所以我想出了这样的办法:Java 无法更改方法中的布尔值,java,methods,boolean,Java,Methods,Boolean,我有个小问题。我正在使用Java声音采样播放mp3,我想在单击按钮时停止播放。所以我想出了这样的办法: package sk.umb.osadnici.Client.Core.getterImages; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.sound.sampled.AudioFormat; import
package sk.umb.osadnici.Client.Core.getterImages;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.FloatControl;
import javazoom.jl.player.advanced.AdvancedPlayer;
import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;
public class GetterForBGMusic {
private SourceDataLine line;
private URL url;
public URL bgUrl, bgUUUrl;
private boolean canPlay = true;
public void runMusic() {
final GetterForBGMusic player = new GetterForBGMusic();
player.play();
}
public void play() {
URL inTTT = getClass().getResource("../sounds/bgMusic.mp3");
try (AudioInputStream in = getAudioInputStream(inTTT)) {
AudioFormat outFormat = getOutFormat(in.getFormat());
Info info = new Info(SourceDataLine.class, outFormat);
try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) {
if (line != null) {
System.out.println(canPlay);
line.open(outFormat);
line.start();
stream(getAudioInputStream(outFormat, in), line);
line.drain();
line.stop();
}
}
} catch (UnsupportedAudioFileException
| LineUnavailableException
| IOException e) {
throw new IllegalStateException(e);
}
}
private AudioFormat getOutFormat(AudioFormat inFormat) {
final int ch = inFormat.getChannels();
final float rate = inFormat.getSampleRate();
return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
}
private void stream(AudioInputStream in, SourceDataLine line)
throws IOException {
while (true) {
System.out.println(this.getCanPlay());
}
}
public void setCanPlay(boolean play) {
this.canPlay = play;
}
public boolean getCanPlay() {
return canPlay;
}
private void booleanValue() {
while (true)
System.out.println(canPlay);
}
}
我正在使用这段代码,如果我在构造函数中调用booleanValue方法,一切都很好。但若在流内调用此方法,则值更改后并没有任何更改
或者有人能告诉我如何停止这一点:您的程序是单线程的,这意味着它执行您从上到下编程的“命令”序列 比如说这个例子,
setCanPlay(true);
play(); //your for loop
setCanPlay(false);
setCanPlay(false)指令仅在for循环完成执行后执行
您需要的是让for循环在后台运行,并且能够在for循环运行时修改canPlay。这就是所谓的多线程,您应该在JavaAPI文档中查找Runnable、Task和Service类,以了解如何实现它
你会得到这样的结果:
setCanPlay(true);
play(); //your for loop, launched in another thread.
setCanPlay(false); // Executed while the for loop is running
这将立即开始和结束比赛
多线程是停止执行程序(从外部)的唯一方法。您在哪里设置
布尔值以及如何设置?请在帖子中添加更多代码。我有getter/setter,我在swing中使用它。所有代码都在post+布尔值下面的链接中:)您永远不会调用setCanPlay(布尔值)
。你能添加调用这个方法的代码吗?这是唯一的方法,看起来canPlay
属性会从你这里的代码中改变。你能把你的swing代码发布到你调用setCanPlay的地方吗?我知道线程,但我还有一个问题。我将boolean设置为true,调用play()方法并创建新线程。但几秒钟后,我想停止这一点,不知道如何。我正在创建游戏,我有mp3文件的背景音乐,现在我正在做设置窗口,可以停止和播放背景音乐。所以现在//如果(boolean)play(),boolean是真的//新线程现在我在你的循环中有类似的东西,你可以检查变量是否设置为true。如果是这样,你就打破了循环。你应该去看看oracle trails教程,它们非常好。