如何再次将组件从 DragAndDropWrapper 中取出

How to get the component out of the DragAndDropWrapper again

我在关注 this guide in order to achieve a solution for my drag and drop scenario. Basically I've an component (Slider) wrapped in a "DragAndDropWrapper”。这很有效。

                final Slider slider = new Slider(title);
                slider.setValue(1.0);
                slider.setWidth("100%");
                slider.setMax(4);
                slider.addStyleName("ticks");

                final DragAndDropWrapper sliderWrap = new DragAndDropWrapper(slider);
                sliderWrap.setDragStartMode(DragStartMode.COMPONENT);
                sliderWrap.setSizeUndefined();
                ((AbstractOrderedLayout) this.getContent()).addComponent(sliderWrap);

好吧,为简化起见,我们假设我们有一个 button wrapped in such a DragAndDropWrapper

final Button button = new Button("An Absolute Button");

final DragAndDropWrapper buttonWrap = new DragAndDropWrapper(button);
buttonWrap.setDragStartMode(DragStartMode.COMPONENT);

我应该如何再次将按钮从那里取出来?我正在寻找这样的东西:

Button myButton = buttonWrap.getComponent(0);

API 没有说明任何可用于这样做的方法(AFAIK)。

使用getCompositionRoot method。不幸的是,此方法受到保护,因此您需要扩展 DragAndDropWrapper 并更改方法可见性。示例:

public class MyDragAndDropWrapper extends DragAndDropWrapper
{
    public MyDragAndDropWrapper(Grid grid)
    {
        super(grid);
    }

    @Override
    public Component getCompositionRoot(){
        return super.getCompositionRoot();
    }
}
//...later on
Grid grid = new Grid(container);
grid.setId("fancyId");
MyDragAndDropWrapper w  = new MyDragAndDropWrapper(grid);
System.out.println(w.getCompositionRoot().getId());
layout.addComponent(w);

请记住,您始终可以在上面的代码中将变量 w 声明为原始 DragAndDropWrapper 并通过转换访问 getCompositionRoot