にメインコントローラと通信し、私はJavaFXのを使用して、単純なシンセサイザープログラムを持っています。 MainControllerクラスとやりとりするために、Metronomeという新しいクラスを作成しようとしています。私はそれ自身のスレッドで実行するためにメトロノームを必要としますが、MainControllerから、特に各ビートにメソッドを実行することができます。メトロノームをオンにしたとき、例えば、それが(それ自身のスレッドで)する必要がある形状の塗りつぶしの色を設定し、メインコントローラにおける方法を通じて音を出します。 MainControllerからのメソッドがループを停止するまで、色を連続的に変更し(オンとオフ)、遅延ループでサウンドを生成します。メトロノームクラスをMainControllerと通信して、それを自分のスレッド上で実行させるにはどうしたらいいですか?Javaの:どのように別々のクラスを作るためにスレッド
編集:だから私は基本的にメインコントローラクラスのメソッドを実行できるようにするメトロノームクラスで私のrun()メソッドが必要です。
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);
}
そして...いくつかのビジュアルコントロールやメトロノームとTimeline
ベースメトロノームの
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