Как программно сгенерировать компонент PickList простых лиц? - PullRequest
0 голосов
/ 13 февраля 2020
public void populateForm(ComponentSystemEvent event) {
    HtmlForm form = (HtmlForm) event.getComponent();

    List<String> citiesSource = new ArrayList<String>();
    List<String> citiesTarget = new ArrayList<String>();
    citiesSource.add("San Francisco");
    citiesSource.add("London");
    citiesSource.add("Paris");
    citiesSource.add("Istanbul");
    citiesSource.add("Berlin");
    citiesSource.add("Barcelona");
    citiesSource.add("Rome");

    cities = new DualListModel<String>(citiesSource, citiesTarget);

    PickList pickList = new PickList();
    pickList.setId("pickList");
    pickList.setValue(cities);
    pickList.setVar("cities");
    pickList.setItemLabel(pickList.getVar());
    pickList.setItemValue(cities);

     form.getChildren().add(pickList);
}

Это был мой подход, и я получил вывод:

Но если я добавлю <p:pickList id="pickList" value="#{bean.cities}" var="cities" itemLabel="#{cities}" itemValue="#{cities}" /> в свой x html, я получу этот вывод :

Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вот как я решил проблему PickList:

FacesContext context = FacesContext.getCurrentInstance();
ExpressionFactory ef = context.getApplication().getExpressionFactory();

PickList pickList = new PickList();

ValueExpression pickListValue = ef.createValueExpression(
    context.getELContext(), "#{ruleManagedBean.cities}",DualListModel.class);

ValueExpression pickListVar = ef.createValueExpression(
            context.getELContext(), "cities", String.class);

ValueExpression pickListItemLabel = ef.createValueExpression(
            context.getELContext(), "#{cities}", String.class);

ValueExpression pickListItemValue = ef.createValueExpression(
            context.getELContext(), "#{cities}", String.class);

pickList.setId("pickList");
pickList.setValueExpression("value", pickListValue);
pickList.setValueExpression("var", pickListVar);
pickList.setValueExpression("itemLabel", pickListItemLabel);
pickList.setValueExpression("itemValue", pickListItemValue);

form.getChildren().add(pickList);

Примечание: ruleManagedBean.cities относится к DualListModel, заполненному как

List<String> citiesSource = new ArrayList<String>();
List<String> citiesTarget = new ArrayList<String>();
citiesSource.add("San Francisco");
citiesSource.add("London");
citiesSource.add("Paris");
citiesSource.add("Istanbul");
citiesSource.add("Berlin");
citiesSource.add("Barcelona");
citiesSource.add("Rome");

cities.setSource(citiesSource);
cities.setTarget(citiesTarget);

Убедитесь, что что вы объявили эту DualListModel глобально, как показано ниже, и у вас есть методы установки геттера

private DualListModel<String> cities = new DualListModel<String>();
0 голосов
/ 13 февраля 2020

Вместо PickList pickList = new PickList(); попробуйте это:

Application application = FacesContext.getCurrentInstance().getApplication();
PickList pickList = (PickList) application.createComponent(PickList.COMPONENT_TYPE);

Измените pickList.setValue(cities); на это:

Примечание: города должно быть полем в вашем бине с собственным геттером.

ExpressionFactory ef = application.getExpressionFactory();
ELContext elc = FacesContext.getCurrentInstance().getELContext();
ValueExpression value = ef.createValueExpression(elc, "#{bean.cities}", DualListModel.class);
pickList.setValueExpression("value", value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...