2016-07-26 43 views
0

我正在致力於swing項目。有一張地圖,我有不同時間的給定數據的光柵圖像。通常,我通過JSlider更改時間,並請求服務器提供光柵圖像。然後我將地圖添加響應圖像。有一個播放JButton,當按下它將逐一添加這些圖像到地圖的柵格圖層。它將被視爲動畫。在該JButton'sactionPerfomed方法中,我更改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嗎?關於我能做什麼的任何建議?

此外,在播放數據之前禁用所有組件並在播放數據後啓用它們的最佳方法是什麼?

非常感謝你提前

+0

爲了更好地幫助越早,張貼[ MCVE]或[簡短,獨立,正確的例子](http://www.sscce.org/)。 –

回答

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

}