0

我需要使用列表框来显示数据库中的一些值,并在选择列表中的单个值时进行进一步处理。

在 PrimeFaces 展示站点,该示例将固定(静态)数据加载到列表框中,并且每个列表项都有一个 PrimeFaces 命令。当我事先可能不知道项目的数量时,如何动态显示列表框中的项目?

我还需要在文本区域中显示与列表中选择的项目相对应的一些文本。我是否必须为此使用事件侦听器?我想在开始时将文本区域留空。只有在列表框中选择了一个值时,我才想使用一个 bean 来使用该 textarea 检索和存储数据。这可能吗?我该如何实施?

4

2 回答 2

3

当我事先可能不知道项目的数量时,如何动态显示列表框中的项目?

使用<f:selectItems>它绑定到List<T>属性。基本示例,假设您使用 EJB/JPA 与 DB 交互:

private Item selectedItem; // +getter+setter
private List<Item> availableItems; // +getter

@EJB
private ItemService service;

@PostConstruct
public void init() {
    availableItems = service.list();
}

<p:selectOneListbox value="#{bean.selectedItem}" converter="itemConverter">
    <f:selectItems value="#{bean.availableItems}" var="item"
        itemValue="#{item}" itemLabel="#{item.someLabel}" />
</p:selectOneListbox>    

itemConverter应该实现对象并将其javax.faces.convert.Converter转换Item为它的唯一字符串表示形式(通常是它的 DB 标识符),getAsString()并以相反的方式转换getAsObject()


我还需要在文本区域中显示与列表中选择的项目相对应的一些文本。我是否必须为此使用事件侦听器?

只需在更新文本区域的列表框中放置一个<p:ajax>(与标准 JSF 等效的 PrimeFaces <f:ajax>)。例如

<p:selectOneListbox value="#{bean.selectedItem}" converter="itemConverter">
    <f:selectItems value="#{bean.availableItems}" var="item"
        itemValue="#{item}" itemLabel="#{item.someLabel}" />
    <p:ajax update="textarea" />
</p:selectOneListbox>    
<p:inputTextarea id="textarea" value="#{bean.selectedItem.someText}" />

当您选择一个项目时,它将被调用。

也可以看看:

于 2012-06-25T02:23:47.363 回答
1

是的,出于演示目的,大多数示例都加载了静态数据。但是如果你在 PF Showcase 上查看相同的示例,第二个列表框代码如下:

<h:outputText value="Scrollbar: " />
    <p:selectOneListbox id="scroll" value="#{autoCompleteBean.selectedPlayer1}"
        converter="player" style="height:100px">
        <f:selectItems value="#{autoCompleteBean.players}"
            var="player" itemLabel="#{player.name}" itemValue="#{player}" />
    </p:selectOneListbox>

f:selectItems 值属性可以指向一个集合、一个数组、一个映射或一个 SelectItem 实例。因此,上面的示例播放器可以是使用托管 bean 中的数据库填充的任何列表。

但是如果实例不是 SelectItem,则通过在每个对象上调用 toString 来获取标签,最后将 selected itemValue 设置为 selectedPlayer1 属性,但您也可以看到中间有一个转换器,因此传入的 itemValue 字符串被转换返回一个播放器对象,然后设置为 selectedPlayer1。

如果您想在文本区域中显示所选项目,您可以执行以下操作:

 <h:outputText value="Scrollbar: " />
    <p:selectOneListbox id="scroll" value="#{autoCompleteBean.selectedPlayer1}"
        converter="player" style="height:100px">
        <f:selectItems value="#{autoCompleteBean.players}"
            var="player" itemLabel="#{player.name}" itemValue="#{player}" />
            <p:ajax update="displayArea"/>
    </p:selectOneListbox>

 <p:inputTextarea id="displayArea" value="#{autoCompleteBean.selectedPlayer1}" />

此处 inputTextarea 使用 ajax 更新,其值由用户选择。

于 2012-06-25T02:24:01.777 回答