2012-02-11 100 views
0

我想添加一個點擊處理程序的圖像,改變圖像的大小。 Blob存儲區允許一個容易通過改變URL的後綴改變圖像的大小,爲「= S128」將改變圖像128點的像素在下面的行:GWT圖像點擊處理程序,改變圖像的大小

im.setUrl(thing.get(i)+"=s128"); 

欲使用該功能單擊後更改圖像的大小;在這個例子中改回原來的大小,如:

//-- when clicked, do this:  
im.setUrl(thing.get(i)); 

,我想下面的代碼將做到這一點的一組圖片:

for (int i=0; i<thing.size(); i++){ 
    final Image im = new Image(); 
    im.setUrl(thing.get(i)+"=s128"); 
    im.addClickHandler(new ClickHandler(){ 
     public void onClick(ClickEvent event){ 
      im.setUrl(response.get(i)); 
     } 
    }); 
    htmlpanel.add(im,"imageGrid"); 
} 

但第二個「setUrl」行給出我這個錯誤:

Multiple markers at this line - Cannot refer to a non-final variable response inside an inner class defined in a different method - Cannot refer to a non-final variable i inside an inner class defined in a different method

我該怎麼做?謝謝。

回答

0

responsei變量應該是最終的。那爲什麼編譯器不能編譯這段代碼。但是你不能使i最終,因爲你在for週期增加它。所以你必須將它複製到一些最後的變量:

for (int i = 0; i < thing.size(); i++){ 
    final Image im = new Image(); 
    final int index = i; //here 
    im.setUrl(thing.get(i) + "=s128"); 
    im.addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      im.setUrl(response.get(index)); 
     } 
    }); 
    htmlpanel.add(im, "imageGrid"); 
} 

但是,最好的解決方法是將創建特殊的點擊處理程序類,將設置一個特定的URL到特定的圖像。

UPDATE

這種結構:

new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      im.setUrl(response.get(index)); 
     } 
    } 

稱爲anonymous class。如果需要在定義它的方法中訪問某個變量/參數,則此變量/參數必須是最終的。

+0

感謝jusio。這解決了這個問題。你能不能補充一下你的答案,爲什麼在這種情況下這些變量應該是最終的? – aez 2012-02-12 04:09:40