我正在致力於swing
項目。有一張地圖,我有不同時間的給定數據的光柵圖像。通常,我通過JSlider
更改時間,並請求服務器提供光柵圖像。然後我將地圖添加響應圖像。有一個播放JButton
,當按下它將逐一添加這些圖像到地圖的柵格圖層。它將被視爲動畫。在該JButton's
actionPerfomed
方法中,我更改for循環中的JSlider's
值。當Jslider的值從JButton定期更改時,Jslider不能打勾
我的問題是當我按播放JButton
,我看不到數據播放,但我知道代碼塊的作品,因爲我記錄每個圖像(從服務器)。我發現它是JButton
的原因,直到它的actionPerformed
方法結束,纔會釋放Focus
。因爲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
事件?我應該在JSlider's
事件中使用第二個SwingWorker
嗎?關於我能做什麼的任何建議?
此外,在播放數據之前禁用所有組件並在播放數據後啓用它們的最佳方法是什麼?
非常感謝你提前
爲了更好地幫助越早,張貼[ MCVE]或[簡短,獨立,正確的例子](http://www.sscce.org/)。 –