Jslider定期从JButton更改其值时无法勾选

时间:2016-07-26 12:48:40

标签: java swing jbutton swingworker jslider

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

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

首先,我尝试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滴答后播放。可能是因为我的耗时过程是在second components(JSlider) stateChanged事件中吗?我是否应该在SwingWorker事件中使用第二个JSlider's?关于我该怎么做的任何建议?

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

非常感谢您提前

1 个答案:

答案 0 :(得分:1)

如果你有两个活动A和活动B必须同时运行,你需要为第二个活动创建一个线程 - 第一个活动已经在它自己的线程(主程序)中运行。

该计划如下:

Program A:

  create new Thread: Activity B

  run allother tasks for Activity A

在更具体的术语中,以下程序将运行模拟并更新滑块的刻度:

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();

}