【问题标题】:JSlider being moved from an outside ObjectJSlider 从外部对象移动
【发布时间】:2013-06-03 20:18:53
【问题描述】:

我正在为模拟创建一个简单的“播放/倒带”界面,其中的 JSlider 既可以用作进度条,也可以用作滑块,您可以将模拟移动到模拟范围内的任何时间点。滑动到时间点效果很好,但是在模拟“播放”时我无法移动实际的滑块。下面显示了指向 GUI 的链接以获得更多帮助:

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

我正在做的事情的简化版本

主对象有 2 个对象,GUI 和控制器。 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);

【问题讨论】:

  • 如果更新依赖于来自更改处理程序中的更改,那么您的代码是循环的,很容易被抓住 - 坏主意。首先尝试将while 更改为if,看看是否有帮助。
  • 在值 CurrentFrame 的 while 循环中添加一个 print 语句,看看它是否有效。这将有助于确定这是否是同步问题。
  • @LiverpoolFTW 刚刚尝试了您的建议。它绝对没有看到 while 循环,有什么想法吗?
  • 您不想从 ChangeEventListener 检查计时器状态,它只会在您移动滑块时触发。您需要将 ActionListener 添加到 Timer 并从那里更新滑块。
  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing jslider


【解决方案1】:

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

【讨论】:

  • 诀窍是确保 JSlider 是正在创建的主类的一部分,因此所有子类(GUI 和控制器)都可以访问它并可以修改它的数据值。谢谢德文!
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 2021-08-18
  • 2017-11-07
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多