Here is a forum post discussing scrollableDataTable issues with selecting rows: http://www.jboss.com/index.html?module=bb&op=viewtopic&t=122543
Below there is a simple example of how you can use the "selection" attribute in order to get row selection in <rich:scrollableDataTable>.
Example xhtml file:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:form>
<rich:spacer height="30" ></rich:spacer>
<rich:scrollableDataTable rowKeyVar="rkv" frozenColCount="1" height="400px"
width="700px" id="carList" rows="40" columnClasses="col"
value="#{dataTableScrollerBean.allCars}" var="category" sortMode="single"
selection="#{dataTableScrollerBean.selection}">
<rich:column id="make">
<f:facet name="header"><h:outputText styleClass="headerText" value="Make" ></h:outputText></f:facet>
<h:outputText value="#{category.make}" ></h:outputText>
</rich:column>
<rich:column id="model">
<f:facet name="header"><h:outputText styleClass="headerText" value="Model" ></h:outputText></f:facet>
<h:outputText value="#{category.model}" ></h:outputText>
</rich:column>
<rich:column id="price">
<f:facet name="header"><h:outputText styleClass="headerText" value="Price" ></h:outputText></f:facet>
<h:outputText value="#{category.price}" ></h:outputText>
</rich:column>
<rich:column id="mileage">
<f:facet name="header"><h:outputText styleClass="headerText" value="Mileage" ></h:outputText></f:facet>
<h:outputText value="#{category.mileage}" ></h:outputText>
</rich:column>
<rich:column width="200px" id="vin">
<f:facet name="header"><h:outputText styleClass="headerText" value="VIN" ></h:outputText></f:facet>
<h:outputText value="#{category.vin}" ></h:outputText>
</rich:column>
<rich:column id="stock">
<f:facet name="header"><h:outputText styleClass="headerText" value="Stock" ></h:outputText></f:facet>
<h:outputText value="#{category.stock}" ></h:outputText>
</rich:column>
</rich:scrollableDataTable>
<rich:spacer height="20px"></rich:spacer>
<a4j:commandButton value="Show Current Selection" reRender="table"
action="#{dataTableScrollerBean.takeSelection}"
oncomplete="javascript:Richfaces.showModalPanel('panel');"></a4j:commandButton>
</h:form>
<rich:modalPanel id="panel" autosized="true">
<f:facet name="header">
<h:outputText value="Selected Rows"></h:outputText>
</f:facet>
<f:facet name="controls">
<span style="cursor:pointer" onclick="javascript:Richfaces.hideModalPanel('panel')">X</span>
</f:facet>
<rich:dataTable value="#{dataTableScrollerBean.selectedCars}" var="sel" id="table">
<rich:column>
<f:facet name="header"><h:outputText value="Make" ></h:outputText></f:facet>
<h:outputText value="#{sel.make}" ></h:outputText>
</rich:column>
<rich:column id="model">
<f:facet name="header"><h:outputText value="Model" ></h:outputText></f:facet>
<h:outputText value="#{sel.model}" ></h:outputText>
</rich:column>
<rich:column id="price">
<f:facet name="header"><h:outputText value="Price" ></h:outputText></f:facet>
<h:outputText value="#{sel.price}" ></h:outputText>
</rich:column>
<rich:column id="mileage">
<f:facet name="header"><h:outputText value="Mileage" ></h:outputText></f:facet>
<h:outputText value="#{sel.mileage}" ></h:outputText>
</rich:column>
<rich:column id="stock">
<f:facet name="header"><h:outputText value="Stock" ></h:outputText></f:facet>
<h:outputText value="#{sel.stock}" ></h:outputText>
</rich:column>
</rich:dataTable>
</rich:modalPanel>
</ui:composition>
-
Example bean:
/**
*
*/
package org.richfaces.datatablescroller;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import org.richfaces.demo.datafilterslider.DemoInventoryItem;
import org.richfaces.model.ScrollableTableDataModel.SimpleRowKey;
import org.richfaces.model.selection.SimpleSelection;
/**
* @author Nick Belaevski - nbelaevski@exadel.com
* created 02.03.2007
*
*/
public class DataTableScrollerBean {
private SimpleSelection selection = new SimpleSelection();
private ArrayList<DemoInventoryItem> selectedCars = new ArrayList<DemoInventoryItem>();
private static int DECIMALS = 1;
private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_UP;
private List <DemoInventoryItem> allCars = null;
public List <DemoInventoryItem> getAllCars() {
synchronized (this) {
if (allCars == null) {
allCars = new ArrayList<DemoInventoryItem>();
for (int k = 0; k <= 5; k++) {
try{
switch (k) {
case 0:
allCars.addAll(createCar("Chevrolet","Corvette", 5));
allCars.addAll(createCar("Chevrolet","Malibu", 8));
allCars.addAll(createCar("Chevrolet","S-10", 10));
allCars.addAll(createCar("Chevrolet","Tahoe", 6));
break;
case 1:
allCars.addAll(createCar("Ford","Taurus", 12));
allCars.addAll(createCar("Ford","Explorer", 11));
break;
case 2:
allCars.addAll(createCar("Nissan","Maxima", 9));
break;
case 3:
allCars.addAll(createCar("Toyota","4-Runner", 7));
allCars.addAll(createCar("Toyota","Camry", 15));
allCars.addAll(createCar("Toyota","Avalon", 13));
break;
case 4:
allCars.addAll(createCar("GMC","Sierra", 8));
allCars.addAll(createCar("GMC","Yukon", 10));
break;
case 5:
allCars.addAll(createCar("Infiniti","G35", 6));
break;
/*case 6:
allCars.addAll(createCar("UAZ","469", 6));
break;*/
default:
break;
}
}catch(Exception e){
System.out.println("!!!!!!loadAllCars Error: " + e.getMessage());
e.printStackTrace();
}
}
}
}
return allCars;
}
public int genRand() {
return rand(1,10000);
}
public List <DemoInventoryItem> createCar(String make, String model, int count){
ArrayList <DemoInventoryItem> iiList = null;
try{
int arrayCount = count;
DemoInventoryItem[] demoInventoryItemArrays = new DemoInventoryItem[arrayCount];
for (int j = 0; j < demoInventoryItemArrays.length; j++){
DemoInventoryItem ii = new DemoInventoryItem();
ii.setMake(make);
ii.setModel(model);
ii.setStock(randomstring(6,7));
ii.setVin(randomstring(14,15));
ii.setMileage(new BigDecimal(rand(5000,80000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setMileageMarket(new BigDecimal(rand(25000,45000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setPrice(new Integer(rand(15000,55000)));
ii.setPriceMarket(new BigDecimal(rand(15000,55000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setDaysLive(rand(1,90));
ii.setChangeSearches(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setChangePrice(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setExposure(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setActivity(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setPrinted(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setInquiries(new BigDecimal(rand(0,5)).setScale(DECIMALS, ROUNDING_MODE));
demoInventoryItemArrays[j] = ii;
}
iiList = new ArrayList<DemoInventoryItem>(Arrays.asList(demoInventoryItemArrays));
}catch(Exception e){
System.out.println("!!!!!!createCategory Error: " + e.getMessage());
e.printStackTrace();
}
return iiList;
}
public static int rand(int lo, int hi)
{
Random rn2 = new Random();
//System.out.println("**" + lo);
//System.out.println("**" + hi);
int n = hi - lo + 1;
int i = rn2.nextInt(n);
return lo + i;
}
public static String randomstring(int lo, int hi)
{
int n = rand(lo, hi);
byte b[] = new byte[n];
for (int i = 0; i < n; i++)
b[i] = (byte)rand('A', 'Z');
return new String(b);
}
public SimpleSelection getSelection() {
return selection;
}
public void setSelection(SimpleSelection selection) {
System.out.println("Setting Started");
this.selection = selection;
System.out.println("Setting Complete");
}
public String takeSelection() {
getSelectedCars().clear();
Iterator<SimpleRowKey> iterator = getSelection().getKeys();
while (iterator.hasNext()){
SimpleRowKey key = iterator.next();
getSelectedCars().add(getAllCars().get(key.intValue()));
}
return null;
}
public ArrayList<DemoInventoryItem> getSelectedCars() {
return selectedCars;
}
public void setSelectedCars(ArrayList<DemoInventoryItem> selectedCars) {
this.selectedCars = selectedCars;
}
}
You can also see the working example of <rich:scrollableDataTable> usage Here
Comments