java - Jslider从JButton周期性改变值时无法勾选

标签 java swing jbutton swingworker jslider

我正在开发一个 swing 项目。有一张 map ,我有不同时间给定数据的光栅图像。通常我通过 JSlider 更改时间,并请求服务器提供光栅图像。然后我将响应图像添加到 map 中。有一个 Play JButton,当按下它时,它将把这些图像一一添加到 map 的栅格图层中。它将被视为动画。在该 JButton actionPerfomed 方法中,我在 for 循环中更改了 JSlider's 值。

我的问题是,当我按下“播放JButton”时,我看不到正在播放的数据,但我知道代码块有效,因为我记录了每个图像(来自服务器)。我发现这是因为JButton在其actionPerformed方法结束之前不会释放Focus。因为 JButton 看起来像是一直被按下直到最后。所以我只能看到 map 中的最后一个图像。

首先,我尝试了 JButton.setFocusable(false) 等,但效果不佳。

其次,我尝试使用SwingWorker。我是这样添加的:

class PlayMvgmLayerWorker extends SwingWorker<Void, Void> {

public PlayMvgmLayerWorker(String title) {
    super(title);
}

@Override
protected void done(Void aVoid) {

}

@Override
protected Void doInBackground() {
    try{
        BufferedImage[] image = new BufferedImage[24];
        for(int i=0; i<24; i++) {

            final int value = i - 48 + 24;
            timeSlider.setValue( value );
            Thread.sleep(10000l);
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
}
<小时/>
private JButton animation = new JButton("");

animation.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

        new PlayMvgmLayerWorker("title").execute();
    }
});
<小时/>
private JSlider timeSlider = new JSlider();
timeSlider.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        // time consuming processes ( server call, add image to map, etc)
    }
});

我尝试简化它。

比以前好多了,但还是看不到正常播放的数据。有时数据会在 JSlider 刻度之后播放。难道是因为我的耗时过程是在第二个组件(JSlider) stateChanged事件中?我是否也应该在 JSlider's 事件中使用第二个 SwingWorker ?关于我能做什么有什么建议吗?

此外,在播放数据之前禁用所有组件并在播放数据之后启用它们的最佳方法是什么?

提前非常感谢

最佳答案

如果您有两个 Activity “Activity A”和“Activity B”必须同时运行,则需要为第二个 Activity 创建一个线程 - 第一个 Activity 已在其自己的线程(主程序)中运行。

方案如下:

Program A:

  create new Thread: Activity B

  run allother tasks for Activity A

更具体地说,以下程序将运行您的模拟并更新 slider 的刻度:

public P() {

animation.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      doInBackgroundImp();
    }
});

  setSize(500, 500);
  setLayout(new FlowLayout());
  add(animation);
  add(timeSlider);
  setVisible(true);
}

protected void doInBackgroundImp() {
    Thread th=new Thread() {
      public void run() {
    try{
        for(int i=0; i<24; i++) {

            final int value = i - 48 + 24;
            timeSlider.setValue( i );
            System.out.println(timeSlider.getValue()+" "+value);
            Thread.sleep(1000);
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
      }
    };
    th.start();
}

private JButton animation = new JButton("");

private JSlider timeSlider = new JSlider();

}

关于java - Jslider从JButton周期性改变值时无法勾选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38590350/

相关文章:

java - 如何使JCheckbox数组具有动态长度?

java - JButton 绝对位于我的 Paint() 板下方

java - 在 for 循环中创建 JButton 后将其删除

java - 使用restfb获取页面访问 token 的正确方法是什么?

java - 将 setParameter 与节点集一起使用时,会引发异常 "Invalid conversion from java.lang.String to node-set"

java - 通过服务器线程调用OSGi服务

java - SwingWorker 卡在 Unsafe.park()

java - 我可以在 Jogl 中嵌入 Swing 组件吗?

java - 为什么spring boot总是两小时后关机

java - 在我最小化并再次打开窗口之前,JButtons 不会显示