GWT编辑器 - 使用valuelistbox从列表中选择一个项目

时间:2013-12-02 16:00:57

标签: java gwt gwt-editors

我有一个包含几个子编辑器的ValueAwareEditor:

基本上,OfferDto由TariffDto和Commission组成。委员会可以是4种子类型中的一种,但只有一种。通常,TariffDto中可能的佣金列表只包含一个元素,但有时可能包含两个元素。

public class OfferDto
{
    private TariffDto tariff;

    // selected from the list in the tariff
    private Commission commission;
}

public class TariffDto extends EntityDto
{
    // omitted for brevity...

    protected List<Commission> commissions = new ArrayList<Commission>();
}

当佣金包含多个项目时,我想显示带有两个optiions的下拉列表,并添加允许用户在它们之间进行选择,每次重置OfferDto和CommissionEditor中的佣金。

问题是,当第二次调用commission.setValue()时,编辑器不会改变。我该怎么办?

public class OfferEditor extends Composite implements ValueAwareEditor<OfferDto>
{
    @UiField
    TariffRenderer tariff;

    @Ignore
    @UiField
    HTMLPanel panel;

    @UiField
    CommissionEditor commission;

    @Override
    public void setValue(final OfferDto value)
    {
        panel.clear();
        List<Commission> commissions = value.getTariff().getCommissions();

        if(commissions.size() == 1)
        {
            value.setCommission(commissions.get(0));
        }
        else
        {
            // multiple commissions
            ValueListBox<Commission> dropdown = new ValueListBox<Commission>(new Renderer<Commission>()
            {
                @Override
                public String render(Commission object)
                {
                    return object == null ? "" : object.getName();
                }
                @Override
                public void render(Commission object, Appendable appendable) throws IOException
                {
                    appendable.append(render(object));
                }
            });

            dropdown.setValue(value.getCommission());
            dropdown.setAcceptableValues(commissions);
            dropdown.addValueChangeHandler(new ValueChangeHandler<Commission>()
            {
                @Override
                public void onValueChange(ValueChangeEvent<Commission> event)
                {
                    Commission selected = event.getValue();

                    // this works, but the CommissionEditor that was first rendered remains
                    value.setCommission(selected);

                }

            });

            panel.add(dropdown);
        }
    }
}

目前,我正在呈现ValueListBox中的佣金列表,然后当值更改时,我将该值推送到OfferDto。委员会似乎已经做好了准备,但是subEditor并没有改变。

非常感谢任何帮助。

修改

CommissionEditor根据类型显示相关的子编辑器。

public class CommissionEditor extends Composite implements Editor<Commission>
{
    private static CommissionEditorUiBinder uiBinder = GWT.create(CommissionEditorUiBinder.class);

    interface CommissionEditorUiBinder extends UiBinder<Widget, CommissionEditor>
    {
    }

    @UiField
    Panel subEditorPanel;

    public CommissionEditor()
    {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Ignore
    final UnitRateCommissionEditor unitRateCommissionEditor = new UnitRateCommissionEditor();

    @Path("")
    final AbstractSubTypeEditor<Commission, UnitRateCommission, UnitRateCommissionEditor> unitRateCommissionEditorWrapper = new AbstractSubTypeEditor<Commission, UnitRateCommission, UnitRateCommissionEditor>(
            unitRateCommissionEditor)
    {
        @Override
        public void setValue(final Commission value)
        {
            if(value instanceof UnitRateCommission)
            {
                setValue(value, value instanceof UnitRateCommission);
                System.out.println("UnitRateCommission setValue");

                subEditorPanel.clear();
                subEditorPanel.add(unitRateCommissionEditor);
            }
        }
    };

    @Ignore
    final StandingChargeCommissionEditor standingChargeCommissionEditor = new StandingChargeCommissionEditor();

    @Path("")
    final AbstractSubTypeEditor<Commission, StandingChargeCommission, StandingChargeCommissionEditor> standingChargeCommissionEditorWrapper = new AbstractSubTypeEditor<Commission, StandingChargeCommission, StandingChargeCommissionEditor>(
            standingChargeCommissionEditor)
    {
        @Override
        public void setValue(final Commission value)
        {
            if(value instanceof StandingChargeCommission)
            {
                setValue(value, value instanceof StandingChargeCommission);
                System.out.println("StandingChargeCommission setValue");

                subEditorPanel.clear();
                subEditorPanel.add(standingChargeCommissionEditor);
            }
        }
    };

    @Ignore
    final PerMwhCommissionEditor perMwhCommissionEditor = new PerMwhCommissionEditor();

    @Path("")
    final AbstractSubTypeEditor<Commission, PerMwhCommission, PerMwhCommissionEditor> perMwhCommissionEditorWrapper = new AbstractSubTypeEditor<Commission, PerMwhCommission, PerMwhCommissionEditor>(
            perMwhCommissionEditor)
    {
        @Override
        public void setValue(final Commission value)
        {
            if(value instanceof PerMwhCommission)
            {
                setValue(value, value instanceof PerMwhCommission);
                System.out.println("PerMwhCommission setValue");

                subEditorPanel.clear();
                subEditorPanel.add(perMwhCommissionEditor);
            }
        }
    };

}

可能的解决方案:

我改变了OfferEditor

public class OfferEditor extends Composite implements Editor<OfferDto>
{       
    @UiField
    TariffRenderer tariff;

    @Path("tariff.commissions")
    @UiField
    CommissionsEditor commission;
}

新编辑器CommissionsEditor是CompositeEditor。它需要采用List tariff.commissions并将所选委员会设置为offer.commission:

public class CommissionsEditor extends Composite implements CompositeEditor<List<Commission>, Commission, CommissionEditor>
{
    private static CommissionsEditorUiBinder uiBinder = GWT.create(CommissionsEditorUiBinder.class);

    interface CommissionsEditorUiBinder extends UiBinder<Widget, CommissionsEditor>
    {
    }

    private EditorChain<Commission, CommissionEditor> chain;

    @UiField
    FlowPanel dropdownPanel, subEditorPanel;

    @Ignore
    CommissionEditor subEditor;

    public CommissionsEditor()
    {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Override
    public void setValue(List<Commission> valueList)
    {
        // clear both panels
        dropdownPanel.clear();
        subEditorPanel.clear();

        if(valueList.size() == 1)
        {
            // set the commission to the first in the list
            Commission selected = valueList.get(0);
            subEditor = new CommissionEditor();
            subEditorPanel.add(subEditor);
            chain.attach(selected, subEditor);
        }
        else if(valueList.size() > 1)
        {
            ValueListBox<Commission> dropdown = new ValueListBox<Commission>(new Renderer<Commission>()
            {
                @Override
                public String render(Commission object)
                {
                    return object == null ? "" : object.getName();
                }
                @Override
                public void render(Commission object, Appendable appendable) throws IOException
                {
                    appendable.append(render(object));
                }
            });

            dropdownPanel.add(dropdown);
            dropdown.setValue(valueList.get(0));
            dropdown.setAcceptableValues(valueList);

            dropdown.addValueChangeHandler(new ValueChangeHandler<Commission>()
            {
                @Override
                public void onValueChange(ValueChangeEvent<Commission> event)
                {
                    Commission selected = event.getValue();

                    subEditorPanel.clear();

                    CommissionEditor subEditor = new CommissionEditor();
                    subEditorPanel.add(subEditor);
                    chain.attach(selected, subEditor);

                }

            });

        }

    }

    @Override
    public void flush()
    {

    }

    @Override
    public void onPropertyChange(String... paths)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void setDelegate(EditorDelegate<List<Commission>> delegate)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public CommissionEditor createEditorForTraversal()
    {
        return new CommissionEditor();
    }

    @Override
    public String getPathElement(CommissionEditor subEditor)
    {
        return null;
    }

    @Override
    public void setEditorChain(EditorChain<Commission, CommissionEditor> chain)
    {
        this.chain = chain;
    }

}

CommissionsEditor呈现下拉列表并调用onValueChange()时,会创建新编辑器,但佣金的值似乎永远不会被设置。

由于某种原因,所选的subEditor值不会被推送到offer.setCommission()。我以为chain.attach()会为我执行此操作吗?

0 个答案:

没有答案