進行状況バーとシミュレーションの境界内の任意の時点にシミュレーションを移動できるスライダーの両方として機能する JSlider を使用して、シミュレーション用の単純な「再生/巻き戻し」インターフェイスを作成しています。ある時点へのスライドは完全に機能しますが、シミュレーションが「再生」されている間は実際のスライダーを動かすことができません。追加の支援のために、GUI へのリンクを以下に示します。
http://i.stack.imgur.com/7rAWf.png
私が行っていることの単純化されたバージョン
メイン オブジェクトには、GUI とコントローラの 2 つのオブジェクトがあります。gui: スライダー/ボタンとコントローラーを作成します。スライダーとボタンの変更/アクション リスナーがコントローラーに設定されている
コントローラ: 再生/巻き戻し機能を実行するさまざまなボタン。これは、「フレーム」ごとにシミュレーションを再描画するスイング タイマーを使用して処理されます。スライダーを使用すると、スライダーをドラッグすると「CurrentFrame」が変更され、再描画関数が呼び出されます。それがしていないのは、タイマーの実行中に自分自身をスライドさせることです。stateChanged のコードは次のとおりです。
public void stateChanged(ChangeEvent z)
{
JSlider source = (JSlider)z.getSource();
//If statement that checks if the state of the slider is done changing when the change listener is evoked
if(!source.getValueIsAdjusting())
{
CurrentFrame = (int)source.getValue();
colladaRoot.setPosition(framePos[CurrentFrame]);
wwd.repaint();
}
// My attempt at checking if the timer is running, and changing the value of the slider
// while it is.
while (timer.isRunning())
source.setValue(CurrentFrame);
}
必要に応じて、これは GUI クラスで作成するスライダーでもあります。
JSlider framecontroller = new JSlider(0, LastFrame, CurrentFrame);
framecontroller.addChangeListener(this.controller);
framecontroller.setMajorTickSpacing(200);
framecontroller.setMinorTickSpacing(1);
framecontroller.setPaintTicks(true);
framecontroller.setPaintLabels(true);