我正在开展一个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
?关于我该怎么做的任何建议?
此外,在播放数据之前禁用所有组件的最佳方法是什么,并在播放数据后启用它们?
非常感谢您提前
答案 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();
}