Is it possible to have multiple lines with jsf h: datatable

With h: datatable we can display the data as follows

  • Jems
  • Tom
  • Chirs
  • Harry

but I can display the same as below:

  • Jems 2.tom
  • chris 4. harry

Ragards, Abi

+3
source share
3 answers

You can use the t: component dataTable , which supports the attributes "newspaperColumns" and "newspaperOrientation". Newspaper Columns determine the number of columns by which the table will be divided, and the newspaper Orientation - the orientation of the newspaper columns in the newspaper table.

In your bean example:

public class Bean {
    public List<String> getPeople() {
        List<String> people = new ArrayList<String>();
        people.add("Jems");
        people.add("tom");
        people.add("chirs");
        people.add("harry");
        return people;
    }
}

And JSF:

<t:dataTable var="person" value="#{bean.people}" rowIndexVar="index"
             newspaperOrientation="horizontal" newspaperColumns="2">
    <h:column>
        <h:outputText value="#{index + 1}"/>
    </h:column>
    <h:column>
        <h:outputText value="#{person}"/>
    </h:column>
</t:dataTable>

Mark as:

<table>
  <tbody id="_id13:tbody_element">
    <tr><td>1</td><td>Jems</td><td>2</td><td>tom</td></tr>
    <tr><td>3</td><td>chirs</td><td>4</td><td>harry</td></tr>
  </tbody>
</table>
+1
source

You can control it in the model.

, :

public class PairedList<T> extends AbstractList<Pair<T>> {
  private final List<? extends T> data;
  private final T defaultVal;

  public PairedList(List<? extends T> data, T defaultVal) {
    this.data = data;
    this.defaultVal = defaultVal;
  }

  @Override public int size() {
    return (data.size() / 2) + (data.size() % 2);
  }

  @Override public Pair<T> get(int index) {
    int left = index * 2;
    int right = left + 1;
    return new Pair<T>(data.get(left), right >= data.size() ? defaultVal : data
        .get(right));
  }

  @Override public boolean addAll(Collection<? extends Pair<T>> c) {
    throw new UnsupportedOperationException();
  }
}

:

public class Pair<T> {

  private final T left;
  private final T right;

  public Pair(T left, T right) {
    this.left = left;
    this.right = right;
  }

  public T getRight() { return right; }
  public T getLeft() { return left; }
}

bean, :

public class TwoPerRowBean implements Serializable {
  private final List<String> data = Arrays.asList("Jems", "tom", "chirs",
      "harry", "Barry");

  public List<Pair<String>> getPairedData() {
    return new PairedList<String>(data, "-");
  }
}

:

<h:dataTable value="#{twoPerRowBean.pairedData}" var="pair">
  <h:column> <h:outputText value="#{pair.left}" /> </h:column>
  <h:column> <h:outputText value="#{pair.right}" /> </h:column>
</h:dataTable>
+5

You can pass List<String[]>in <h:datatable value="bean.list">.

@ViewScoped
public class NameClass implements Serializable{

   private List<String[]> list;

   public void onPageLoad(){
      list = someMethod that returns the list;
   }

   //...gettters and setters
}

In .xhtml:

<h:datatable value="nameClass.list" var="l">
   <h:column>#{l[0]}</h:column>
   <h:column>#{l[1]}</h:column>
</h:datatable>
0
source

Source: https://habr.com/ru/post/1715759/