当前位置: 首页 > 知识库问答 >
问题:

在GWT中动态添加画布

盖泽宇
2023-03-14

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

在我的类构造函数中,我添加了1个通用画布,它包含一个背景图像,不能编辑。这个画布(它是全球性的)确实显示出来并正常工作。所有可以编辑的层都存储在List中

这是将画布添加到我的ListFormboard中的方法。

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-index,将画布添加到我的画布列表中,将处理程序添加到画布中(clickhandler,onMouseDownHandler,...)并将画布添加到主上下文中。

添加画布时,ScaledImageWidth和-Height绝对不为null或0。

有什么想法吗?

编辑:通过添加fpCanvas解决了问题。布局();直到方法的末尾。我的formpanel刚刚需要刷新


共有2个答案

孙佐
2023-03-14

通过添加fpCanvas解决了此问题。布局();直到方法的末尾。我的formpanel刚刚需要刷新

黄淇
2023-03-14

下面是我如何管理画布的层:

公共抽象类层扩展复合{

/**
 * The canvas used in this layer
 */
private Canvas m_canvas;


public Layer()
{
    m_canvas = Canvas.createIfSupported();
    initWidget( m_canvas );
}

/**
 * Get the name of the layer (debug purpose only)
 * @return the name of the layer
 */
protected abstract String getLayerName();

/**
 * Set the z-index of the layer
 * @param zindex the new z-index
 */
public void setZ( int zindex )
{
    m_canvas.getElement().getStyle().setZIndex( zindex );
}

public int getZ()
{
    return Integer.parseInt( m_canvas.getElement().getStyle().getZIndex() );
}

@Override
public void setPixelSize( int width, int height )
{
    super.setPixelSize( width, height );
    m_canvas.setCoordinateSpaceWidth( width );
    m_canvas.setCoordinateSpaceHeight( height );
}

/**
 * Draw the layer
 */
public void draw()
{
}

/**
 * Get the context2d where this layer will be drawn
 * 
 * @return the Context2d
 */
public final Context2d getContext2d()
{
    return m_canvas.getContext2d();
}

/**
 * Clear the layer
 */
public void clear()
{
    Context2d context2d = getContext2d();
    if ( m_canvas != null && m_canvas.isAttached() )
    {
        context2d.clearRect( 0, 0, m_canvas.getOffsetWidth(), m_canvas.getOffsetHeight() );
    }
}

public LayoutPanel getEnclosingLayoutPanel()
{
    return (LayoutPanel)getParent();
}

}

加上:

    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 );
    (...)
 类似资料:
  • 添加画笔动态 “画笔”面板提供了许多用于向预设画笔笔尖添加动态(或变化)元素的选项。例如,可以设置在描边路线中改变画笔笔迹的大小、颜色和不透明度的选项。 将动态元素添加到画笔时使用两个组件: 抖动百分比指定动态元素的随机性。如果是 0%,则元素在描边路线中不改变;如果是 100%,则元素具有最大数量的随机性。 “控制”弹出式菜单中的选项指定如何控制动态元素的变化。可以选择不控制元素的变化,按指定数

  • 问题内容: 我知道我可以通过执行以下操作来向对象动态添加实例方法: 稍后我可以打电话给我,自我将被正确绑定,一切正常。 现在,我的问题是:如何做完全相同的事情来获得用@property装饰新方法的行为? 我猜是这样的: 但是,这样做会返回一个属性对象。 问题答案: 在描述对象需要住 类 , 未 在 实例中 ,有你想要的效果。如果您不想更改现有的类以避免更改其他实例的行为,则需要创建“每个实例的类”

  • 主要内容:状态机这一节我们创建一个动画蓝图并在 C++中把它绑定到角色身上 。 状态机 状态机是可以让动画过渡到另一个动画的工具,它大大简化了动画设计流程。 1) 在 UE4 编辑器中,我们以 AnimInstance 为父类创建一个名为 CharacterAnimInstance 的子类。 2) 进入到我们的骨骼网格体文件夹路径,右键选择该资源,创建一个动画蓝图。 3) 双击动画蓝图,点击类设置,然后在右边的细

  • 我有一个NSButton,它的底部与superview的齐平,我想设置它向上移动的动画,使其顶部与superview的齐平。 WWDC 2012课程228:掌握自动布局的最佳实践提到了两种设置布局更改动画的方法(31:16),我正在尝试使用CoreAnimation技术。下面的示例确实正确地移动了NSButton,但它是即时移动的,没有动画。 我能补充一下吗

  • 问题内容: 如何在jpanel中动态添加组件?当我单击按钮时,我应该有添加按钮,组件应该添加到JPanel。 我的问题是,当我单击添加按钮时,将文本字段和按钮添加到jpanel时,用户可以根据需要将它们添加到jpanel中的任意次数单击添加按钮。我已将scrollerpane添加到我的jpanel,并且jpanel布局管理器设置为null。 问题答案: 像往常一样,除了必须调用: 完成后,因为容器

  • 问题内容: 在我的应用程序中,组件必须动态更改。我有一个数据表,其中我有两列,首先是菜单中的a我有两个数据(数据分别为1和2),如果选择了1,则应出现a,如果选择了2,则应出现。需要帮助吗? 我的JSF 我的豆类 问题答案: 我的建议是:不要动态添加/删除组件。用另一种方法解决您的问题: 切换组件的 可见性 重新绑定属于组件的 数据 动态添加/删除组件始终是麻烦的源头,而且您有可能以另一种简单得多