Gleidson_Henrique 16 de set. de 2012
O exemplo do site do primefaces eu consegui resolver da seguinte maneira:
<p:dataTable id= "cars" var= "car" value= "#{tableBean.mediumCarsModel}" paginator= "true" rows= "10"
selection= "#{tableBean.selectedCar}" selectionMode= "single" >
<p:ajax event= "rowSelect" listener= "#{tableBean.onRowSelect}"
oncomplete= "carDialog.show()" />
<p:ajax event= "rowUnselect" listener= "#{tableBean.onRowUnselect}" />
<f:facet name= "header" >
Select a row to display a message
</f:facet>
<p:column headerText= "Model" >
#{car.model}
</p:column>
<p:column headerText= "Year" >
#{car.year}
</p:column>
<p:column headerText= "Manufacturer" >
#{car.manufacturer}
</p:column>
<p:column headerText= "Color" >
#{car.color}
</p:column>
</p:dataTable>
<p:dialog id= "dialog" header= "Car Detail" widgetVar= "carDialog" resizable= "false"
width= "200" showEffect= "clip" hideEffect= "fold" >
<h:panelGrid id= "display" columns= "2" cellpadding= "4" >
<f:facet name= "header" >
<p:graphicImage value= "/images/cars/#{tableBean.selectedCar.manufacturer}.jpg" />
</f:facet>
<h:outputText value= "Model:" />
<h:outputText value= "#{tableBean.selectedCar.model}" />
<h:outputText value= "Year:" />
<h:outputText value= "#{tableBean.selectedCar.year}" />
<h:outputText value= "Manufacturer:" />
<h:outputText value= "#{tableBean.selectedCar.manufacturer}" />
<h:outputText value= "Color:" />
<h:outputText value= "#{tableBean.selectedCar.color}" />
</h:panelGrid>
</p:dialog>
import java.util.List ;
import javax.faces.model.ListDataModel ;
import org.primefaces.model.SelectableDataModel ;
public class CarDataModel extends ListDataModel < Car > implements SelectableDataModel < Car > {
public CarDataModel () {
}
public CarDataModel ( List < Car > data ) {
super ( data );
}
@Override
public Car getRowData ( String rowKey ) {
//In a real app, a more efficient way like a query by rowKey should be implemented to deal with huge data
List < Car > cars = ( List < Car > ) getWrappedData ();
for ( Car car : cars ) {
if ( car . getModel (). equals ( rowKey ))
return car ;
}
return null ;
}
@Override
public Object getRowKey ( Car car ) {
return car . getModel ();
}
}
import java.io.Serializable ;
import java.util.ArrayList ;
import java.util.Date ;
import java.util.List ;
import java.util.UUID ;
import java.util.logging.Logger ;
import javax.faces.application.FacesMessage ;
import javax.faces.bean.ApplicationScoped ;
import javax.faces.bean.ManagedBean ;
import javax.faces.bean.SessionScoped ;
import javax.faces.bean.ViewScoped ;
import javax.faces.context.FacesContext ;
import org.primefaces.event.SelectEvent ;
import org.primefaces.event.UnselectEvent ;
@ManagedBean
@SessionScoped
public class TableBean {
private final static Logger logger = Logger . getLogger ( TableBean . class . getName ());
private 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 > carsSmall ;
private Car selectedCar ;
private CarDataModel mediumCarsModel ;
public TableBean () {
carsSmall = new ArrayList < Car > ();
populateRandomCars ( carsSmall , 50 );
mediumCarsModel = new CarDataModel ( carsSmall );
}
private void populateRandomCars ( List < Car > list , int size ) {
for ( int i = 0 ; i < size ; i ++ )
list . add ( new Car ( getRandomModel (), getRandomYear (), getRandomManufacturer (), getRandomColor ()));
}
public Car getSelectedCar () {
return selectedCar ;
}
public void setSelectedCar ( Car selectedCar , SelectEvent event ) {
selectedCar = ( Car ) event . getObject ();
this . selectedCar = selectedCar ;
}
public CarDataModel getMediumCarsModel () {
return mediumCarsModel ;
}
public void onRowSelect ( SelectEvent event ) {
FacesMessage msg = new FacesMessage ( "Car Selected" , (( Car ) event . getObject ()). getModel ());
selectedCar = ( Car ) event . getObject ();
FacesContext . getCurrentInstance (). addMessage ( null , msg );
}
public void onRowUnselect ( UnselectEvent event ) {
FacesMessage msg = new FacesMessage ( "Car Unselected" , (( Car ) event . getObject ()). getModel ());
FacesContext . getCurrentInstance (). addMessage ( null , msg );
}
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 int getRandomSale () {
return ( int ) ( Math . random () * 100000 );
}
private int getRandomProfit () {
return ( int ) ( Math . random () * 100 );
}
private String getRandomModel () {
return UUID . randomUUID (). toString (). substring ( 0 , 8 );
}
}
Eu modifiquei a linha do TableBean e adicionei um evento, como segue:
public void setSelectedCar(Car selectedCar, SelectEvent event) {
selectedCar = (Car) event.getObject();
this.selectedCar = selectedCar;
}
Vou tentar implementar em minhas aplicações.. vamos ver se funciona..
Abraços