0

ページの上部で、優先言語を変更するドロップダウンが必要です。変更された場合、ページは再ロードされ、選択した言語でレンダリングされます。私のソリューションでは、言語はすぐにはロードされません。

@SuppressWarnings("serial")
public class CurrentLanguageDropdown extends LanguageDropDown {

private String sessionlanguage;
private IModel<String> model;

public CurrentLanguageDropdown(String id, Locale locale) {
    super(id, locale);
    this.sessionlanguage = locale.getCountry();
    GlobalAccountSession session = GlobalAccountSession.get();
    model = new SelectedLocaleModel("sessionlanguage", this, new     Model<Serializable>(session.getLocale()),
            locale.getCountry());
    setModel(model);
}

@Override
public void onSelectionChanged(String newSelection) {
    GlobalAccountSession session = GlobalAccountSession.get();
    model = new SelectedLocaleModel("sessionlanguage", this, new Model<Serializable>(session.getLocale()),
            newSelection);
}

@Override
protected boolean wantOnSelectionChangedNotifications() {
    return true;
}

String getSessionlanguage() {
    return sessionlanguage;
}

private class SelectedLocaleModel extends StringResourceModel {

    private String selectedValue = "";
    private Component parent;

    public SelectedLocaleModel(String resourceKey, Component parent, IModel<?> model, String selectedValue) {
        super(resourceKey, parent, model);
        this.selectedValue = selectedValue;
        this.parent = parent;
    }

    @Override
    public void setObject(java.lang.String object) {
        GlobalAccountSession session = GlobalAccountSession.get();
        Locale locale = new Locale(object.toString());
        session.setLocale(locale);
        selectedValue = locale.getLanguage();
    }

    @Override
    public String getObject() {
        GlobalAccountSession session = GlobalAccountSession.get();
        selectedValue = session.getLocale().getLanguage();
        return selectedValue;
    }
}
}

私のコードを見ると、最初に getObject が呼び出され、その後に setObject が呼び出されていることがわかります。そのため、ユーザーによる変更が処理される前にレンダリングが行われるようです。

誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

1

onSelectionChanged で新しいモデル オブジェクトを作成しています。これは、変更する必要はあるが置き換えてはならないモデルの目的を無効にします。新しいモデル オブジェクトを作成する必要がある場合は、コンポーネントで使用されているモデルも置き換える必要があります (再度 setModel(model) を呼び出します)。

于 2013-01-30T09:05:09.610 に答える
0

これはコンポーネントではなく、コンポーネントの実装であることは知っていますが、一般的な考え方を示しています

public class LocaleDropDownPanel extends Panel
{
private Locale sessionLocale;

public LocaleDropDownPanel(String id, Locale locale) 
{
    super(id);


    ArrayList<Locale> choices = Lists.newArrayList(Locale.getAvailableLocales());

    //didnt know if you need country or language 
    IChoiceRenderer<Locale> choiceRenderer = new ChoiceRenderer<Locale>("language");

    DropDownChoice<Locale> ddc = new DropDownChoice<Locale>("ddc", new PropertyModel<Locale>(this, "sessionLocale"), 
            new Model<ArrayList<Locale>>(choices), choiceRenderer)
    {
        @Override
        protected void onSelectionChanged(Locale newSelection) 
        {
             //if you want to save the selected locale in your session.
             GlobalAccountSession session = GlobalAccountSession.get();
             session.setLocale(newSelection);
        }
    };

    //This Language selected to begin with
    ddc.setDefaultModelObject(locale);

}

public Locale getSessionLocale() {
    return sessionLocale;
}

public void setSessionLocale(Locale sessionLocale) {
    this.sessionLocale = sessionLocale;
}
}
于 2013-01-30T14:54:03.940 に答える