2014-06-08 33 views
-1

我有問題在GUI上顯示當前,我正在使用Swing Worker根據我的要求工作。善良的人幫助我更新每次點擊圖像,而圖像生成需要時間,因爲圖像是通過圖形生成的。我正在打在我的項目... enter code here圖形用戶界面沒有更新每次點擊的圖像,因爲圖形的新圖像需要時間來生成每一個新的圖像,所以GUI顯示前一圖像

private static void show1(){ 
      SwingWorker<Void,Void> worker1= new SwingWorker<Void,Void>(){ 
       @Override 
       protected Void doInBackground() throws Exception { 
        Thread.sleep(100); 
       gp.GraphPanel();// here in graph panel image is not updated   
        return null; 
      } 
      protected void done() { 
      } 
     };  
     worker1.execute();  
      } 
    // show1 is called inside action listener 
     public static JScrollPane GraphPanel() 
     {    // some code here 
        ImageIcon imgIcon=new ImageIcon(FILE_NAME.filename+".png"); 
      label.setIcon(imgIcon); 
      pane2.add(label); 
        JScrollPane grphPane= new JScrollPane(pane2); 
        return grphPane; 

     } 

回答

1

水族的答案是,你應該使用SwingWorker正確的手段,但是,你什麼都不做與所得到的你創建的GraphPane實例JScrollPane方法

此方法創建GraphPane的新實例...

public static JScrollPane GraphPanel() 
{    // some code here 
    ImageIcon imgIcon=new ImageIcon(FILE_NAME.filename+".png"); 
    label.setIcon(imgIcon); 
    pane2.add(label); 
    JScrollPane grphPane= new JScrollPane(pane2); 
    return grphPane; 
} 

但是C阿靈像...

gp.GraphPanel(); 

是否與它無關,你應該加入這個方法將你的UI的結果...

基於您的代碼示例,label似乎是一個實例變量,如果它已經在屏幕上,你應該只需要設定其icon屬性,讓UI更新它的自我

public void updateGraph() 
{    // some code here 
    ImageIcon imgIcon=new ImageIcon(FILE_NAME.filename+".png"); 
    label.setIcon(imgIcon); 
} 

此外,避免static如果可能的話,這是一個很好的跡象,你的設計工作需要

1

您應該事件指派線程訪問搖擺僅組件。另一方面,您試圖從doInBackground構建並訪問JScrollPane。 SwingWorker的doInBackground在輔助工作線程上執行。這是後臺任務應該發生的地方。如果圖像準備需要時間,則可以在doInBackground中執行此操作。然後,覆蓋done()方法,您可以將結果圖像添加到UI。 done()Event Dispatch Thread上執行。有關更多詳細信息,請參閱Concurrency in Swing

下面是一個簡單的例子:

class Worker extends SwingWorker<Image, Void> { 
    @Override 
    protected Image doInBackground() throws Exception { 
     Image image = ImageIO.read(new File("some path")); 
     //TODO process the image 
     return image; 
    } 

    @Override 
    protected void done() { 
     try { 
      Image image = get(); 
      //TODO use the image 
      //ImageIcon imgIcon = new ImageIcon(image); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}