Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法访问处理程序方法外部的Canvas元素_Java_Gwt_Canvas_Handler_Drawimage - Fatal编程技术网

Java 无法访问处理程序方法外部的Canvas元素

Java 无法访问处理程序方法外部的Canvas元素,java,gwt,canvas,handler,drawimage,Java,Gwt,Canvas,Handler,Drawimage,伙计们,我一直在想这里到底出了什么问题。我终于找到了我结巴的地方。下面的代码是我的项目中的一个片段,显示了唯一的问题。 这是我的EntryPoint课程: 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.clie

伙计们,我一直在想这里到底出了什么问题。我终于找到了我结巴的地方。下面的代码是我的项目中的一个片段,显示了唯一的问题。 这是我的EntryPoint课程:

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);

    }

}
那是我的资源管理课

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;
    }

}
除了一件已经让我抓狂的事情外,一切都很完美

drawImage(resourceManager.getResourceCanvas().getCanvasElement(),0,0); 在调用内部处理程序之前不起作用

请解释我哪里错了。非常感谢

在画布附加到文档之前(
canvas.isAttached()
,但附加到根面板也可以),您不能在其上绘制

它还必须设置大小,因为调整大小会对内容产生不利影响


颠倒这些语句的顺序,它应该按原样工作。加载处理程序工作的原因是,在调用它时,画布已经连接,因此可以将其绘制到。

不,我尝试了所有方法,并使用如下方法:“canvas.rect(…);canvas.stroke();”如果draw方法工作得很好,则改为“canvas.rect(…);canvas.stroke();”。麻烦只有在使用绘图方法时才会开始。作为修复,我可以使用附加处理程序并在其中调用此方法。但我想解释一下(是的,使用draw方法,如果在附件之后调用,效果会很好。但是前面提到的方法在附件之前也可以。
ctx.drawImage(resourceManager.getResourceCanvas().getCanvasElement(), 0, 0);
RootPanel.get().add(canvas);