如何以编程方式生成 primefaces PickList 组件?
How to generate primefaces PickList component programmatically?
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);
}
这是我的方法,我得到的输出是:
但是如果我在我的 xhtml 中添加 <p:pickList id="pickList" value="#{bean.cities}" var="cities" itemLabel="#{cities}" itemValue="#{cities}" />
,我会得到这个输出:
这是怎么回事?
而不是 PickList pickList = new PickList();
试试这个:
Application application = FacesContext.getCurrentInstance().getApplication();
PickList pickList = (PickList) application.createComponent(PickList.COMPONENT_TYPE);
为此更改您的pickList.setValue(cities);
:
注意: cities 必须是您的 bean 上的一个字段,它有自己的 getter.
ExpressionFactory ef = application.getExpressionFactory();
ELContext elc = FacesContext.getCurrentInstance().getELContext();
ValueExpression value = ef.createValueExpression(elc, "#{bean.cities}", DualListModel.class);
pickList.setValueExpression("value", value);
这就是我解决 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 并具有 getter setter 方法
private DualListModel<String> cities = new DualListModel<String>();
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);
}
这是我的方法,我得到的输出是:
但是如果我在我的 xhtml 中添加 <p:pickList id="pickList" value="#{bean.cities}" var="cities" itemLabel="#{cities}" itemValue="#{cities}" />
,我会得到这个输出:
这是怎么回事?
而不是 PickList pickList = new PickList();
试试这个:
Application application = FacesContext.getCurrentInstance().getApplication();
PickList pickList = (PickList) application.createComponent(PickList.COMPONENT_TYPE);
为此更改您的pickList.setValue(cities);
:
注意: cities 必须是您的 bean 上的一个字段,它有自己的 getter.
ExpressionFactory ef = application.getExpressionFactory();
ELContext elc = FacesContext.getCurrentInstance().getELContext();
ValueExpression value = ef.createValueExpression(elc, "#{bean.cities}", DualListModel.class);
pickList.setValueExpression("value", value);
这就是我解决 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 并具有 getter setter 方法
private DualListModel<String> cities = new DualListModel<String>();