我有一個簡單的使用JavaFX的合成器程序。我正在嘗試創建一個名爲Metronome的新類來與MainController類進行交互。我需要節拍器在它自己的線程上運行,但仍然能夠運行MainController中的方法,特別是在每個節拍上。例如,打開節拍器時,需要(在自己的線程上)設置形狀的填充顏色,並通過MainController中的方法發出聲音。它會不斷改變顏色(關閉和開啓),並在延遲循環中發出聲音,直到MainController中的方法停止循環。我如何讓Metronome類與我的MainController進行通信,然後讓它在自己的線程上運行?Java:如何使線程與MainController分開的類溝通
編輯:所以我基本上需要我在節拍器類run()方法能夠在MainController類中運行方法。
public class MainController implements Initializable {
public AudioMain audio = new AudioMain();
@ FXML public AnchorPane mainPane;
public boolean debugMessages = true;
public boolean debugMessages2 = false;
public boolean debugMessages3 = false;
//public final int numKeys = 13;
public int C4 = 60; //The midi pitch of C4
public int octave = 4; //The default octave to be assigned
public String synthType = "Saw";
public SynthSet synth = new SynthSet(111, synthType); //Creates a new SynthSet of 13 SineWaves
public double bpm = 120;
public Metronome metronome = new Metronome(bpm);
....some code later....
public void toggleMetronome() {
metronome.toggleMet();
}
public void lightOn() {
metronomeLight.setFill(lightOnColor);
}
public void lightOff() {
metronomeLight.setFill(lightOffColor);
}
然後..
public class Metronome implements Runnable{
public boolean metronomeOn = false;
public boolean metronomeSound = true;
public boolean metOutputMessages = true;
public boolean tick8th = false;
public double bpm = 20;
public long msPerBeat = (long) (60000/bpm); // Miliseconds per beat
public int tickCount = 0;
public long nano;
public Metronome() {
}
public Metronome(double beat) {
setTempo(beat);
}
public static void main(String args[]) {
Metronome met = new Metronome();
met.metOn();
}
@Override
public void run() {
System.out.println(msPerBeat);
while (metronomeOn) {
beat();
delay(msPerBeat/2);
if (tick8th) beat8th();
delay(msPerBeat/2);
}
}
public void metOn() {
if (!metronomeOn) {
outMessage("Starting metronome at " + bpm + " bpm");
metronomeOn = true;
new Thread(this).start();
}
}
public void metOff() {
if (metronomeOn) {
outMessage("Stopping metronome");
metronomeOn = false;
}
}
public void toggleMet() {
if (metronomeOn) {
metOff();
}else if (!metronomeOn)
metOn();
}
public void beat() {
tickCount++;
outMessage("Beep " + tickCount);
}
}
你通常會做這種使用條件變量或事件。就目前而言,你的問題有點太寬泛,無法在這裏回答。 –
你能分享一段代碼嗎?你的問題太籠統了。這真的很難回答。 – nono
您可能會考慮使用[時間軸](http://docs.oracle.com/javase/8/javafx/visual-effects-tutorial/basics.htm#BEIIDFJC)來控制節拍器,而不是單獨的線程。您可以在時間軸中使用[KeyValue](https://docs.oracle.com/javase/8/javafx/api/javafx/animation/KeyValue.html),並使用更改偵聽器在值更改時執行操作。 – jewelsea