2015-08-26 1 views
0

Les gars J'ai beaucoup essayé de comprendre ce qui ne va pas ici. Finalement, j'ai trouvé un endroit où je suis resté coincé. Le code suivant est extrait de mon projet, montrant le seul problème. C'est mon EntryPoint Classe:Impossible d'accéder à l'élément de canevas à l'extérieur de la méthode du gestionnaire

import com.google.gwt.canvas.client.Canvas; 
import com.google.gwt.canvas.dom.client.Context2d; 
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.madmax.client.gameservice.GWTService; 
import com.madmax.client.gameservice.GWTServiceAsync; 
import com.madmax.client.resources.ResourceManager; 
import com.madmax.client.resources.images.cards.LandCardResources; 


public class AltEntryPoint implements EntryPoint { 


    public AltEntryPoint() { 
    } 

    public static GWTServiceAsync getService() { 


     return GWT.create(GWTService.class); 
    } 
    private final Canvas canvas= Canvas.createIfSupported(); 
    private final Context2d ctx = canvas.getContext2d(); 



    @Override 
    public void onModuleLoad() { 
     final ResourceManager resourceManager = new ResourceManager(1000, 1000); 
     Button b1 = new Button("Click", new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
           ctx.drawImage(resourceManager.getResourceCanvas().getCanvasElement(), 0, 0); 
      } 
     }); 

     resourceManager.loadImgResource(LandCardResources.INSTANCE.getHellHorseKnight(), "knight", 0, 0); 
     resourceManager.loadImgResource(LandCardResources.INSTANCE.getMeadow(), "meadow", 150, 150); 


     canvas.setWidth(500 + "px"); 
     canvas.setHeight(500 + "px"); 
     canvas.setCoordinateSpaceWidth(500); 
     canvas.setCoordinateSpaceHeight(500); 

       RootPanel.get().add(resourceManager.getResourceCanvas()); 
       ctx.drawImage(resourceManager.getResourceCanvas().getCanvasElement(), 0, 0); 
       RootPanel.get().add(canvas); 
       RootPanel.get().add(b1); 

    } 

} 

et c'est ma ResourceManeger classe

import com.google.gwt.canvas.client.Canvas; 
import com.google.gwt.canvas.dom.client.Context2d; 
import com.google.gwt.dom.client.ImageElement; 
import com.google.gwt.event.dom.client.LoadEvent; 
import com.google.gwt.event.dom.client.LoadHandler; 
import com.google.gwt.resources.client.ImageResource; 
import com.google.gwt.user.client.ui.Image; 
import com.google.gwt.user.client.ui.RootPanel; 


public class ResourceManager { 

    private Canvas allImageHolderCanvas; 
    private Context2d allImageHolderContext; 

    public ResourceManager(int lengthDimension, int heightDimension) { 
     allImageHolderCanvas = Canvas.createIfSupported(); 
     allImageHolderCanvas.setWidth(lengthDimension + "px"); 
     allImageHolderCanvas.setHeight(heightDimension + "px"); 
     allImageHolderCanvas.setCoordinateSpaceWidth(lengthDimension); 
     allImageHolderCanvas.setCoordinateSpaceHeight(heightDimension); 
     allImageHolderContext = allImageHolderCanvas.getContext2d(); 
    } 

    public void loadImgResource(ImageResource resource, String name, double sx, double sy) { 
     final Image localImage = new Image(resource); 
     localImage.setVisible(false); 
     final String localName = name; 
     final double sxVal = sx; 
     final double syVal = sy; 

     localImage.addLoadHandler(new LoadHandler() { 

      @Override 
      public void onLoad(LoadEvent event) { 
       allImageHolderContext.drawImage(ImageElement.as(localImage.getElement()), 
         0, 0, localImage.getWidth(), localImage.getHeight(), sxVal, syVal, 1000, 1000); 
      } 
     }); 

     RootPanel.get().add(localImage); 
    } 

    public void drawImageFromMetaDb(Context2d context, double sx, double sy, double sw, 
      double sh, double dx, double dy, double dw, double dh){ 
     context.drawImage(allImageHolderCanvas.getCanvasElement(), sx, sy, sw, sh, dx, dy, dw, dh); 
    } 

    public Canvas getResourceCanvas(){ 
     return this.allImageHolderCanvas; 
    } 

} 

Tout fonctionne parfaitement, sauf une chose qui me fout déjà dehors.

ctx.drawImage (resourceManager.getResourceCanvas(). GetCanvasElement(), 0, 0); ne fonctionne pas tant qu'il n'a pas été appelé dans Handler.

Veuillez m'expliquer où je me trompe. Merci beaucoup.

Répondre

2
ctx.drawImage(resourceManager.getResourceCanvas().getCanvasElement(), 0, 0); 
RootPanel.get().add(canvas); 

Jusqu'à ce que la toile est jointe au document (canvas.isAttached(), mais attacher aux RootPanel fera aussi), vous ne pouvez pas tirer dessus. Il doit également avoir une taille définie, car le redimensionnement affectera votre contenu.

Inverser l'ordre de ces instructions, et cela devrait fonctionner tel quel. La raison pour laquelle le gestionnaire de chargement fonctionne est que, au moment où il est appelé, le canevas a été attaché, de sorte qu'il peut être dessiné.

+0

Non, j'ai tout essayé, et en utilisant des méthodes comme ceci: "canvas.rect (...); canvas.stroke();" au lieu de cela, si la méthode draw fonctionne parfaitement. Les problèmes commencent uniquement lors de l'utilisation de la méthode draw. En tant que correctif, je peux utiliser Attach Handler et invoquer cette méthode à l'intérieur. Mais je désire pour l'explication ( –

+0

Et oui, en utilisant la méthode dessiner, fonctionne parfaitement si invoqué, après la pièce jointe.Mais les méthodes mentionnées précédemment fonctionnent aussi bien avant la pièce jointe. –