2012-02-11 24 views
0

画像のサイズを変更する画像にクリックハンドラーを追加したいと思います。私はこの機能を使用したい画像のサイズを変更するGWT画像クリックハンドラー

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

:ブロブストアは1つが簡単に以下の行に128個のピクセルに画像を変更します「=のS128」と、URLの接尾辞を変更することで、画像のサイズを変更することができます画像をクリックした後に画像のサイズを変更する。この例では同じように、元のサイズに戻って変更するには:

//-- 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

responseおよびi変数が最終的である必要があります。そのため、コンパイラはこのコードをコンパイルできません。しかし、あなたがforサイクルでそれをインクリメントしているので、iを最終にすることはできません。だから、いくつかの最後の変数にコピーする必要があります:

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

ありがとうございます。これは問題を解決します。この場合、なぜこれらの変数が最終的であるべきか、あなたの答えに親切に追加できますか? – aez

関連する問題