# JSF/Richfaces rich:dataTable with rich:datascroller



## TDT-44 (10. Nov 2010)

Hallo zusammen,
ich habe ein Problem und komme einfach nicht auf die Lösung! Ich ahne das es etwas ganz simples ist, aber ich komme einfach nicht darauf!
Also hier das Problem:
Ich habe eine rich:dataTable in der ich mit einem rich:dataScroller navigieren will. in meinem beispiel habe ich eine 3x3Matrix pro seite. also auf einer seite werden herkunftländer von steaks gezeigt und die art wie man sie haben will(blood_rare, medium, well_done).



hier der quellcode für die jsf seite:

```
<%@ page session="false" contentType="text/html;charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<%@include file="include/head.inc"%>
<body>
<center><f:view>

	<f:loadBundle basename="#{messageHandler.languagePack}" var="msg" />

	<a4j:keepAlive beanName="dataScrollerBean" ajaxOnly="true" />

	<t:panelLayout id="page" layout="classic" styleClass="pageLayout"
		headerClass="pageHeader" footerClass="pageFooter">

		<f:facet name="header">
			<f:subview id="header">
				<jsp:include page="include/page_header.jsp" />
			</f:subview>
		</f:facet>


		<f:facet name="body">

			<h:form>
			
				<center><rich:dataTable width="500" id="exampleList"
					styleClass="articleTable" rows="3" columnClasses="col"
					value="#{dataScrollerBean.articleList}" var="item">

					<f:facet name="header">

						<rich:columnGroup>
							<h:column>
								<h:outputText value="Steak origin}" />
							</h:column>
							<h:column>
								<h:outputText value="blood rare" />
							</h:column>
							<h:column>
								<h:outputText value="medium" />
							</h:column>
							<h:column>
								<h:outputText value="well done" />
							</h:column>
							<h:column>
								<h:outputText value="Add-Button" />
							</h:column>
						</rich:columnGroup>
					</f:facet>

					<h:column>
						<h:outputText value="#{item.origin}" />
					</h:column>
					<h:column>
						<center><h:selectBooleanCheckbox 
							value="#{item.blood_rare}" /></center>
					</h:column>
					<h:column>
						<center><h:selectBooleanCheckbox 
							value="#{item.medium}" /></center>
					</h:column>
					<h:column>
						<center><h:selectBooleanCheckbox 
							value="#{item.well_done}" /></center>
					</h:column>
				
					<h:column>
						<center><h:commandButton value="Add" 
							action="#{dataScrollerBean.print}" /></center>
					</h:column>
 					

				</rich:dataTable> 
				<rich:spacer height="2" />
					<rich:datascroller align="center" action="#{dataScrollerBean.print}" for="exampleList" maxPages="20"
						id="sc2" reRender="sc2" />
					<rich:spacer height="20" />

					
					<h:commandButton value="Print" action="#{dataScrollerBean.print}" />
					
					
					</center>
			</h:form>

		</f:facet>

		<f:facet name="footer">
			<f:subview id="footer">
				<jsp:include page="include/page_footer.jsp" />
			</f:subview>
		</f:facet>

	</t:panelLayout>

</f:view></center>
</body>
</html>
```

*Das Problem liegt nun darin, das Checkboxen die ich ausgewählt haben nicht gespeichert werden, wenn ich auf die 2. Seite der Tabelle geh! *Momentan ist es so wenn ich auf die nächste Seite geh und wieder zurück ist alles unselected obwohl ich selected hab.
Wenn ich nun allerdings auf der Seite den Print-Button drücke speichert er die werte ich es funktioniert so wie ich es will!
Deswegen habe ich als workaround einen add-Button hinter jede Zeile, aber geht natürlich jegliche userability verloren 

Mit dem actionListener und valueChangelistener hab ich es auch versucht aber hat net funktioniert!

hier ist noch der Java des Beans und des Containers.

Ich hoffe jemand kann mir Helfen oder hat einen Tipp für mich! danke und grüße TDT

Bean:

```
package test;

import java.util.ArrayList;
import java.util.List;

public class CopyDataScrollerBean {

	private List<DataScrollerSteak> selectedArticleList;

	public List<DataScrollerSteak> articleList;
	
	
	//standard Constructor
	public CopyDataScrollerBean() {
	
		System.out.println("Constructor");
	
		articleList = new ArrayList<DataScrollerSteak>();
		
		articleList = this.fillContainer();
		
	}
	
	
	public List<DataScrollerSteak> fillContainer(){
		
		List<DataScrollerSteak> steakContainer = new ArrayList<DataScrollerSteak>();
		
		DataScrollerSteak steak1 = new DataScrollerSteak("Argentinia", "steak1", false, false, false);
		DataScrollerSteak steak2 = new DataScrollerSteak("China", "steak2", false, false, false);
		DataScrollerSteak steak3 = new DataScrollerSteak("Brasil", "steak3", false, false, false);
		DataScrollerSteak steak4 = new DataScrollerSteak("Germany", "steak4", false, false, false);
		DataScrollerSteak steak5 = new DataScrollerSteak("Hunsrück(Schwencker)", "steak5", false, false, false);
		DataScrollerSteak steak6 = new DataScrollerSteak("Bavaria", "steak6", false, false, false);
		
		steakContainer.add(steak1);
		steakContainer.add(steak2);
		steakContainer.add(steak3);
		steakContainer.add(steak4);
		steakContainer.add(steak5);
		steakContainer.add(steak6);
		
		return steakContainer;
	}
	
	public String getSelectedItems() {

		System.out.println("getSelectedItems");
		
        // Get selected items.
        selectedArticleList = new ArrayList<DataScrollerSteak>();
        
        System.out.println(articleList.size());
        
        for (DataScrollerSteak dataItem : articleList) {
            
        	System.out.println(dataItem.getSteakId());
        	System.out.println(dataItem.isBlood_rare());	
        	System.out.println(dataItem.isMedium());
        	System.out.println(dataItem.isWell_done());
       
        	if(dataItem.isBlood_rare() || dataItem.isMedium() || dataItem.isWell_done() ){
        		
        		selectedArticleList.add(dataItem);
        		System.out.println("in add");
            	
        	}
        	
        	if(dataItem.getOrigin().equals(dataItem.getOrigin())){	
        	}
        	if (dataItem.isBlood_rare()) {
                dataItem.setBlood_rare(true); // Reset.
            }
        	if (dataItem.isMedium()) {;
                dataItem.setMedium(true); // Reset.
            }
        	if (dataItem.isWell_done()) {
                dataItem.setWell_done(true); // Reset.
            }
        	
        }
      
        return null;
    }
	
	public String print(){
		
		
		this.getSelectedItems();
		
		for(int i=0;i<this.getSelectedArticleList().size();i++){
			System.out.println(this.getSelectedArticleList().get(i).getSteakId() + " - " + 
								this.getSelectedArticleList().get(i).getOrigin() + " - " +
								this.getSelectedArticleList().get(i).isBlood_rare() + " - " + 
								this.getSelectedArticleList().get(i).isMedium() + " - " + 
								this.getSelectedArticleList().get(i).isWell_done() );
		}
		
		return null;
	}


	
	// GETTER & SETTER

		public List<DataScrollerSteak> getSelectedArticleList() {
			return selectedArticleList;
		}
 
		public void setSelectedArticleList(List<DataScrollerSteak> selectedArticleList) {
			this.selectedArticleList = selectedArticleList;
		}


		public List<DataScrollerSteak> getArticleList() {
			return articleList;
		}


		public void setArticleList(List<DataScrollerSteak> articleList) {
			this.articleList = articleList;
		}
	
}
```

SteakContainer:

```
package test;

public class DataScrollerSteak {

	private String origin;
	private String steakId;
	
	private boolean blood_rare;
	private boolean medium;
	private boolean well_done;
	
	
	public DataScrollerSteak(String origin, String steakId, boolean blood_rare, boolean medium, boolean well_done) {
	
		this.origin = new String(origin);
		this.steakId = new String(steakId);
		this.blood_rare = false;
		this.medium = false;
		this.well_done= false;
		
	}
	

	public String getOrigin() {
		return origin;
	}


	public String getSteakId() {
		return steakId;
	}


	public boolean isBlood_rare() {
		return blood_rare;
	}


	public boolean isMedium() {
		return medium;
	}


	public boolean isWell_done() {
		return well_done;
	}


	public void setOrigin(String origin) {
		this.origin = origin;
	}


	public void setSteakId(String steakId) {
		this.steakId = steakId;
	}


	public void setBlood_rare(boolean bloodRare) {
		blood_rare = bloodRare;
	}


	public void setMedium(boolean medium) {
		this.medium = medium;
	}


	public void setWell_done(boolean wellDone) {
		well_done = wellDone;
	}


	
}
```

PS: Falls ich was vergessen hab bitte einfach kurz bescheid sagen! Danke


----------



## laggyshaggy (29. Apr 2011)

Hallo,
Auch wenn dein Posting schon atwes älter ist, hier die Lösung:

```
<h:selectBooleanCheckbox id="idFooCheckbox"
                                   value="#{foo.selected}">                                   
  <a4j:support ajaxSingle="true" event="onclick"/>
</h:selectBooleanCheckbox>
```
Durch <a4j:support ajaxSingle="true" event="onclick"/> werden deinen Eingaben auch über verschiedene "Pages" hinweg gespeichert.

Beste Grüße


----------

