Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 在GWT中动态添加画布_Java_Gwt_Canvas - Fatal编程技术网

Java 在GWT中动态添加画布

Java 在GWT中动态添加画布,java,gwt,canvas,Java,Gwt,Canvas,我目前正在开发一个图像编辑器应用程序。 我试图在我的应用程序中提供一个选项来处理不同的层,比如GIMP或Photoshop。我的方法是为用户添加的每个层添加一个Canvas。 一切都很好,但不知怎么的,我动态添加的画布没有出现 在我的类构造函数中,我添加了1个通用画布,其中包含一个背景图像,无法编辑。这个画布(是全局的)确实显示并正常工作。所有可编辑的图层都存储在画布图层列表中 这是应该向我的列表和表单面板添加画布的方法 public void addCanvasLayer(String lay

我目前正在开发一个图像编辑器应用程序。 我试图在我的应用程序中提供一个选项来处理不同的层,比如GIMP或Photoshop。我的方法是为用户添加的每个层添加一个
Canvas
。 一切都很好,但不知怎么的,我动态添加的画布没有出现

在我的类构造函数中,我添加了1个通用画布,其中包含一个背景图像,无法编辑。这个画布(是全局的)确实显示并正常工作。所有可编辑的图层都存储在画布图层列表中

这是应该向我的
列表
表单面板
添加画布的方法

public void addCanvasLayer(String layerName, int id){
    Canvas newCanvas = Canvas.createIfSupported();

    newCanvas.setWidth(this.scaledImageWidth + "px");
    newCanvas.setHeight(this.scaledImageHeight + "px");
    newCanvas.setCoordinateSpaceWidth(this.scaledImageWidth);
    newCanvas.setCoordinateSpaceHeight(this.scaledImageHeight);

    newCanvas.getElement().setId(layerName);
    newCanvas.getElement().getStyle().setZIndex(id);

    this.fpCanvas.add(newCanvas, new AbsoluteData(0, 0));

    this.canvasLayers.add(newCanvas);
    this.addCanvasHandler(newCanvas);

    context = newCanvas.getContext2d();
}
它所做的一切就是创建画布,将其大小设置为主宽度和高度,设置其id和z索引,将画布添加到我的画布列表,将处理程序添加到画布(clickhandler,onMouseDownHandler,…),并将画布添加到主上下文。 添加画布时,ScaledImageWidth和-Height绝对不为null或0

有什么想法吗

编辑:通过添加fpCanvas.layout()解决了问题;直到方法的末尾。
我的formpanel刚刚需要刷新以下是我如何管理画布层:

公共抽象类层 扩展复合 {

}

加上:

    public void addLayer( Layer layer, int zindex )
{
    // m_main is a LayoutPanel
    int width = m_main.getOffsetWidth();
    int height = m_main.getOffsetHeight();
    m_layers.add( layer );
    layer.setZ( zindex );
    if ( m_main.getWidgetCount() > 0 )
    {
        m_main.insert( layer, 1 );
    }
    else
    {
        m_main.add( layer );
    }
    layer.setPixelSize( width, height );
    (...)

通过添加fpCanvas.layout()解决了此问题;直到方法的末尾。我的formpanel刚刚需要刷新,谢谢你的快速回复!我不太可能放弃当前处理层的方式,因此我将尝试找出不同之处:不是处理画布本身,而是使用一个包含画布+一些更改属性的功能的层类。所以它只是外包给了另一个班级。我的:创建临时画布并将其添加到我的全局列表中可能有问题吗?我看到的唯一区别是我的画布与它们所连接的小部件大小相同。如果您有firefox,请打开web Developer tools(Ctrl+Shift+I),然后打开3D视图。旋转页面,检查是否可以看到所有画布层彼此重叠。当我这样做的时候,我可以在下降几层之后选择任何一层,最后我得到的结果是:
。也许你的画布尺寸有问题。我还在寻找解决办法。。。这是我的状态:我的全局画布已附加到我的formpanel。但不知何故,所有由addCanvasLayer(String layerName,int id)创建的画布都不会显示在formpanel上,尽管我使用的代码与我的方法中创建全局画布的代码完全相同。是否不可能创建本地画布,将其添加到全局列表并使用它??在调试和监视我的formpanel时,所有画布都被附加,但我的本地画布元素数据为空。
    public void addLayer( Layer layer, int zindex )
{
    // m_main is a LayoutPanel
    int width = m_main.getOffsetWidth();
    int height = m_main.getOffsetHeight();
    m_layers.add( layer );
    layer.setZ( zindex );
    if ( m_main.getWidgetCount() > 0 )
    {
        m_main.insert( layer, 1 );
    }
    else
    {
        m_main.add( layer );
    }
    layer.setPixelSize( width, height );
    (...)