2012-12-19 141 views
3

我在一個按鈕中顯示圖像,並且當單擊該按鈕時,它會打開一個組合,允許我選擇另一張圖片用於該按鈕。保存操作後,下面的代碼調整圖片大小並將其保存到目錄中。然後它加載重新加載組合。當組合加載按鈕時,該按鈕會根據用戶正在查看的記錄的ID從默認位置拉取圖像。我遇到的問題是,除非關閉並重新加載應用程序,否則按鈕上的圖像保持不變。需要注意的一件有趣事情是,當加載默認按鈕圖像時(即,沒有爲其ID保存圖片),按鈕圖像會根據需要進行更改,但僅限於第一次。 希望我已經清楚描述了我的問題,如果你需要我澄清請評論。Java SWT按鈕圖像不刷新

---代號爲保存按鈕 -

Button btnSave = new Button(this, SWT.NONE); 
    btnSave.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      String path = txtPhotoPath.getText(); 
      if (CC_Files.fileExists(path)) { 
       ArrayList<String> picTypes = new ArrayList<String>(); 
       picTypes.add(".jpg"); 
       picTypes.add(".png"); 
       picTypes.add(".gif"); 
       int t = 0; 

       for(int i = 0; i < picTypes.size(); i++){ 
        String s = picTypes.get(i); 
        if(path.contains(s.toUpperCase())){ 
         t++; 
        } 
        if(path.contains(s.toLowerCase())){ 
         t++; 
        } 
       } 
       if (t > 0) { 
        Image image = (Image) SWTResourceManager.getImage(path); 
        ImageData imgData = image.getImageData(); 
        int intH = image.getBounds().height; 
        int intW = image.getBounds().width; 
        int h = (150 * intH)/intW; 
        int w = 150; 
        if (h > 150){ 
         h = 150; 
         w = (150 * intW)/intH; 
        } 
        imgData = imgData.scaledTo(w, h); 
        ImageLoader imageLoader = new ImageLoader(); 
        imageLoader.data = new ImageData[] { imgData }; 
        imageLoader.save(Variables.getStrResources() 
          + "Pics\\" + a.getHerd_id() + ".jpg", 
          SWT.IMAGE_JPEG); 
        try { 
         Frm_Animal.setAnimalEditSC(Frm_Animal 
           .createAnimalComp(a)); 
        } catch (Exception e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 
       } 
      } 
     } 
    }); 
    GridData gd_btnSave = new GridData(SWT.LEFT, SWT.CENTER, false, false, 
      1, 1); 
    gd_btnSave.widthHint = 60; 
    btnSave.setLayoutData(gd_btnSave); 
    btnSave.setText("Save"); 
創建按鈕在複合

--- ---代碼

Button btnPic = new Button(composite, SWT.CENTER); 

    btnPic.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      try { 
       Comp_Add_Photo photo = new Comp_Add_Photo(
         scrolledComposite, SWT.FILL, a); 
       setAnimalEditSC(photo); 

      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    }); 

    Image image = null; 
    String strPic = Variables.getStrResources() + "Pics\\" + a.getHerd_id() +".jpg"; 
    if(CC_Files.fileExists(strPic)){ 
     image = (Image) SWTResourceManager 
       .getImage(strPic); 
    }else { 
    image = (Image) SWTResourceManager 
      .getImage(Variables.getStrResources() + "black_cow.png"); 
    } 

    btnPic.setImage(image); 

    btnPic.setToolTipText("Click Here To Add Photo"); 
    GridData gd_btnPic = new GridData(SWT.CENTER, SWT.CENTER, false, false, 
      1, 7); 
    gd_btnPic.heightHint = 160; 
    gd_btnPic.widthHint = 160; 
    btnPic.setLayoutData(gd_btnPic); 

回答

4

我想這可能是因爲你正在使用SWTResourceManager和它必須有某種緩存。由於圖像的路徑保持不變,因此它會返回較舊的圖像。 SWTResourceManager屬於哪個API?在重新加載新圖像之前是否可以處理單個圖像?也許稱爲SWTResourceManager#dipose()。我希望有一些方法可以清除特定圖像的緩存。

+1

良好的通話! [這裏](http://dev.eclipse.org/svnroot/tools/org.eclipse.windowbuilder/trunk/org.eclipse.wb.rcp/resources/1.5/org/eclipse/wb/swt/SWTResourceManager.java)是'SWTResourceManager'的來源。它是WindowBuilder的一部分。然而,沒有辦法清除單個圖像的緩存輸入。然而,因爲這個類是在項目中創建的,所以用手實現這樣的方法真的很容易... – Baz

+0

2問題A:我可以做一個SWTResourceManager的實例,然後配置它清除它的緩存? B:如果不是,我會怎樣去手工製作緩存清除方法?謝謝 – Talon06

+0

我得到了我加了SWTResourceManager.dispose(); image =(Image)SWTResourceManager.getImage(strPic);這將清除SWTResourceManager緩存。感謝您指點我正確的方向。 – Talon06