0

進行状況バーとシミュレーションの境界内の任意の時点にシミュレーションを移動できるスライダーの両方として機能する 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);
4

1 に答える 1