1

我正在尝试执行Primefaces Showcase上可用的 DataTable 示例。所有功能都有效,但是当我选择一行时,所选行的值不会显示在我的<p:dialog>.

我已经检查了所有替代方案,但没有任何效果。有人可以帮助我吗?

我正在使用 Primefaces 3.3 和 glassfish 3.0.1。这是我的代码:

数据表复杂.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>

    </h:head>

    <body>

        <h:form id="form">

            <p:dataTable var="car" value="#{tableBean.cars}" rowKey="#{car.model}" paginator="true" rows="10"
                         selection="#{tableBean.selectedCar}" selectionMode="single" id="carsTable">

                <p:ajax event="rowSelect" update=":form:display" oncomplete="carDialog.show()" />

                <f:facet name="header">
                    List of Cars
                </f:facet>

                <p:column headerText="Model" sortBy="#{car.model}" filterBy="#{car.model}" id="model">
                    #{car.model}
                </p:column>

                <p:column headerText="Year" sortBy="#{car.year}" filterBy="#{car.year}" id="year">
                    #{car.year}
                </p:column>

                <p:column headerText="Manufacturer" sortBy="#{car.manufacturer}" filterBy="#{car.manufacturer}" id="manufacturer">
                    #{car.manufacturer}
                </p:column>

                <p:column headerText="Color" sortBy="#{car.color}" filterBy="#{car.color}" id="color">
                    #{car.color}"
                </p:column>

            </p:dataTable>

            <p:dialog header="Car Detail" widgetVar="carDialog" resizable="false"
                      width="200" showEffect="explode" hideEffect="explode">

                <h:panelGrid id="display" columns="2" cellpadding="4">                  

                    <h:outputText value="Model:" />
                    <h:outputText value="#{tableBean.selectedCar.model}" id="model"/>

                    <h:outputText value="Year:" />
                    <h:outputText value="#{tableBean.selectedCar.year}" id="year"/>

                    <h:outputText value="Manufacturer:" />
                    <h:outputText value="#{tableBean.selectedCar.manufacturer}" id="manufacturer"/>

                    <h:outputText value="Color:" />
                    <h:outputText value="#{tableBean.selectedCar.color}" id="color"/>
                </h:panelGrid>
            </p:dialog>
        </h:form>            
    </body>

</html>

TableBean.java

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ViewScoped
@ManagedBean(name = "tableBean")
@SessionScoped

public class TableBean implements Serializable {

private final static String[] colors;

private final static String[] manufacturers;

static {
    colors = new String[10];
    colors[0] = "Black";
    colors[1] = "White";
    colors[2] = "Green";
    colors[3] = "Red";
    colors[4] = "Blue";
    colors[5] = "Orange";
    colors[6] = "Silver";
    colors[7] = "Yellow";
    colors[8] = "Brown";
    colors[9] = "Maroon";

    manufacturers = new String[10];
    manufacturers[0] = "Mercedes";
    manufacturers[1] = "BMW";
    manufacturers[2] = "Volvo";
    manufacturers[3] = "Audi";
    manufacturers[4] = "Renault";
    manufacturers[5] = "Opel";
    manufacturers[6] = "Volkswagen";
    manufacturers[7] = "Chrysler";
    manufacturers[8] = "Ferrari";
    manufacturers[9] = "Ford";
}

private List<Car> cars;

private Car selectedCar;

private Car[] selectedCars;

public TableBean() {
    cars = new ArrayList<Car>();

    populateRandomCars(cars, 50);
}

public Car getSelectedCar() {
    return selectedCar;
}

public void setSelectedCar(Car selectedCar) {
    this.selectedCar = selectedCar;
}

private void populateRandomCars(List<Car> list, int size) {
    for(int i = 0 ; i < size ; i++)
        list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor()));
}

private int getRandomYear() {
    return (int) (Math.random() * 50 + 1960);
}

private String getRandomColor() {
    return colors[(int) (Math.random() * 10)];
}

private String getRandomManufacturer() {
    return manufacturers[(int) (Math.random() * 10)];
}

private String getRandomModel() {
    return UUID.randomUUID().toString().substring(0, 8);
}

public List<Car> getCars() {
    return cars;
}
}

汽车.java

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean(name = "car")
@SessionScoped

public class Car implements Serializable {

private String model;
private int year;
private String manufacturer;
private String color;
private int price;

public Car(){

}
public Car(String model, int year, String manufacturer, String color) {
            this.model = model;
            this.year = year;
            this.manufacturer = manufacturer;
            this.color = color;
    }

    public Car(String model, int year, String manufacturer, String color, int price) {
            this.model = model;
            this.year = year;
            this.manufacturer = manufacturer;
            this.color = color;
    this.price = price;
    }

    public String getModel() {
            return model;
    }

    public void setModel(String model) {
            this.model = model;
    }

    public int getYear() {
            return year;
    }

    public void setYear(int year) {
            this.year = year;
    }

    public String getManufacturer() {
            return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
            this.manufacturer = manufacturer;
    }

    public String getColor() {
            return color;
    }

    public void setColor(String color) {
            this.color = color;
    }

 public int getPrice() {
    return price;
}

public void setPrice(int price) {
    this.price = price;
}

    @Override
    public boolean equals(Object obj) {
            if(obj == null)
                    return false;

            if(!(obj instanceof Car))
                    return false;

            Car compare = (Car) obj;

            return compare.model.equals(this.model);
    }

    @Override
    public int hashCode() {
            int hash = 1;

        return hash * 31 + model.hashCode();
    }

@Override
public String toString() {
    return "Car{" + "model=" + model + ", year=" + year + ", manufacturer=" + manufacturer + ", color=" + color + ", price=" + price + '}';
}
}

编辑:要解决这个问题,只需在 TableBean.java 上添加@ViewScoped。

4

3 回答 3

1

您的 TableBean 应该是 ViewScoped。

在 TableBean 之上添加 @ViewScoped 或使用 faces-config.xml 文件对其进行配置。

于 2012-08-10T00:06:55.060 回答
0

您正在使用Showcase Labs中的示例,该示例在 PrimeFaces 版本 3.4 上运行(在发布时仍在开发中)。

由于您使用的是 PrimeFaces 3.3,因此您应该使用常见Showcase中的示例。

请记住,Showcase 的Labs版本始终在仍在开发的版本上运行,而通用 Showcase 始终在最新的最终版本上运行。

通过检查页面底部,您始终可以查看 Showcase 后面运行的版本。

于 2012-08-09T16:41:42.727 回答
0

由于 Car 类只是一个普通类,而不是管理 bean,因此您不需要声明:

@ManagedBean(name = "car") @SessionScoped

于 2013-06-05T17:26:27.557 回答