1

あるリスト {ソース} から他のリスト {宛先} に値をロードする 2 つのリスト複数選択ボックスを開発し、Ajaxbuttons を使用して値を相互にロードしようとします。ajax ボタンをクリックすると Java クラスの値を確認できますが、これらの値が UI のターゲット リストの複数選択ボックスに正しく読み込まれません。以下にコードを掲載しました。ここで何が間違っているのかを確認して教えてください。

private AjaxButton add;
private AjaxButton remove;
private List selectedOriginals;
private List selectedDestinations;
private ListMultipleChoice originals;
private ListMultipleChoice destinations;
private List<String> currentDestinations = new ArrayList<String>();

originals = new ListMultipleChoice("originals", new PropertyModel(this, "selectedOriginals"),APPLICATIONS);
originals.setOutputMarkupId(true);
add(originals);

destinations = new ListMultipleChoice("destinations", new PropertyModel(this, "selectedDestinations"), new LoadableDetachableModel() 
{
    @Override
    protected Object load() 
    {
        return currentDestinations;
    }
});
destinations.setOutputMarkupId(true);
add(destinations);

add = new AjaxButton("add")
{
    @Override 
    protected void onError(AjaxRequestTarget target, Form form) 
    { 
        System.out.println("Some error in AJX submission....");
        target.addComponent(feedbackPanel); 
    } 

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form form) 
    {
        update(target,selectedOriginals, originals, destinations);
    }
};
add.setOutputMarkupId(true);
add(add);

remove = new AjaxButton("remove") 
{
    @Override 
    protected void onError(AjaxRequestTarget target, Form form) 
    { 
        System.out.println("Some error in AJX submission....**********************");
        target.addComponent(feedbackPanel); 
    }

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form form) 
    {
        update(target, selectedDestinations, destinations, originals);
    }
};
remove.setOutputMarkupId(true);
add(remove);

更新方法 ::

private void update(AjaxRequestTarget target, List<String> selections, ListMultipleChoice from, ListMultipleChoice to) 
{
    if(selections != null)
    {
        for (String destination : selections) 
        {
            List<String> choices = getChoices(from);
            if (!to.getChoices().contains(destination)) 
            {
                to.getChoices().add(destination);
                choices.remove(destination);
                from.setChoices(choices);
            }
        }

        target.addComponent(to);
        target.addComponent(from);
    }
}
4

1 に答える 1

0

同様のタスクのために私が行っていることは次のとおりです (変数名を使用しようとしました)。ListMultipleChoice オブジェクトは、ajax の更新のために WebMarkupContainers に含める必要がある場合があるため、コンテナーを originalsContainer と destinationsContainer と呼びました。

追加ボタンの onSubmit で:

final List choices = originals.getChoices();
for (int index = 0; index < choices.size(); index++) {
    final Location choice = (Location) choices.get(index);
    final String originalsChoiceIndex = originals.getChoiceRenderer().getIdValue(choice, index);
    if (isSelected(originalsChoiceIndex, originals.getValue()) & !selectedDestinations.contains(choice)) {
        selectedDestinations.add(choice);
    }
}
choices.removeAll(selectedDestinations);
originals.setChoices(choices);
SortUtils.sortDestinations(selectedDestinations);
destinations.setChoices(selectedDestinations);
target.add(originalsContainer);
target.add(destinationsContainer);

私のコードでも 1 つの違いは、ListMultipleChoice(s) を少し異なる方法で初期化したことです。これは、必要な場合とそうでない場合がありoriginals = new ListMultipleChoice("originals", choices, locationRenderer); ます。

final IChoiceRenderer locationRenderer = new IChoiceRenderer() {
    @Override
    public Object getDisplayValue(Object o) {
        return ( (Location) o ).getName();
    }

    @Override
    public String getIdValue(Object o, int i) {
        return ( (Location) o ).getId();
    }
};

お役に立てれば!

于 2013-07-08T15:15:26.453 に答える