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

我的问题是当我按Play 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吗?关于我该怎么办的任何建议?

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

提前非常感谢你

最佳答案

如果必须同时运行两个活动Activity A和Activity 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();

}

07-28 02:33
查看更多