JSlider从外部Object移动

时间:2013-06-03 20:18:54

标签: java swing jslider

我正在为模拟创建一个简单的“播放/回放”界面,JSlider既可以作为进度条,也可以作为滑块,可以将模拟移动到模拟边界内的任何时间点。滑动到时间点工作完美,但是在模拟“正在播放”时我无法移动实际的滑块。下面显示了与GUI的链接以获得更多帮助:

http://i.stack.imgur.com/7rAWf.png

我正在进行的简化版

主对象有2个对象,GUI和Controller。 gui:创建滑块/按钮和控制器。 Slider和Button的更改/动作侦听器设置为Controller

控制器:执行播放/回放功能的各种按钮。这是通过使用摆动计时器来处理的,该计时器在每个“帧”重新绘制模拟。使用滑块,拖动滑块时会更改“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);

1 个答案:

答案 0 :(得分:1)

您不想检查ChangeEventListener中的计时器状态,只有在您移动滑块时才会触发。您需要向ActionListener添加Timer并从那里更新滑块