The <h:panelGrid> renders an HTML "table" element
Common/basic usage is JSF (I) - populate a static
table:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>JSF panelGrid examples</title>
</h:head>
<h:body>
<h:panelGrid columns="6">
<h:outputText value="1"/>
<h:outputText value="Williams, Serena"/>
<h:outputText
value="United States"/>
<h:outputText value="26
Sep 1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
<h:outputText value="2"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText
value="Romania"/>
<h:outputText value="27 Sep
1991"/>
<h:outputText value="6580"/>
<h:outputText value="18"/>
<h:outputText value="3"/>
<h:outputText value="Sharapova,
Maria"/>
<h:outputText value="Russia"/>
<h:outputText value="19 Apr
1987"/>
<h:outputText
value="4691"/>
<h:outputText
value="17"/>
</h:panelGrid>
</h:body>
</html>
The columns attribute represents the number of
columns to render before starting a new row. The above code will be rendered in
HTML as:
<table>
<tbody>
<tr>
<td>1</td>
<td>Williams, Serena</td>
<td>United States</td>
<td>26 Sep 1981</td>
<td>11285</td>
<td>15</td>
</tr>
<tr>
<td>2</td>
<td>Halep, Simona</td>
<td>Romania</td>
<td>27 Sep 1991</td>
<td>6580</td>
<td>18</td>
</tr>
<tr>
<td>3</td>
<td>Sharapova, Maria</td>
<td>Russia</td>
<td>19 Apr 1987</td>
<td>4691</td>
<td>17</td>
</tr>
</tbody>
</table>
Basic/common usage (II) - display a nice form with
labels, inputs and error messages:
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="nameId" value="Name:"/>
<h:inputText id="nameId" required="true"/>
<h:message for="nameId" style="color:red;"/>
<h:outputLabel for="emailId" value="E-mail:"/>
<h:inputText id="emailId" required="true"/>
<h:message for="emailId"
style="color:red;"/>
<h:outputLabel for="countryId"
value="Country:"/>
<h:selectOneMenu id="countryId"
required="true">
<f:selectItem itemLabel="Romania"/>
<f:selectItem itemLabel="Spain"/>
<f:selectItem itemLabel="Italy"/>
</h:selectOneMenu>
<h:message for="countryId"
style="color:red;"/>
<h:commandButton value="Order"/>
</h:panelGrid>
</h:form>
More examples:
Render a table with header and footer
<h:form>
<h:panelGrid columns="3">
<f:facet name="header">
Place
your order below
</f:facet>
<h:outputLabel for="nameId"
value="Name:"/>
<h:inputText id="nameId"
required="true"/>
<h:message for="nameId"
style="color:red;"/>
<h:outputLabel for="emailId"
value="E-mail:"/>
<h:inputText id="emailId"
required="true"/>
<h:message for="emailId" style="color:red;"/>
<h:outputLabel for="countryId"
value="Country:"/>
<h:selectOneMenu id="countryId"
required="true">
<f:selectItem
itemLabel="Romania"/>
<f:selectItem
itemLabel="Spain"/>
<f:selectItem
itemLabel="Italy"/>
</h:selectOneMenu>
<h:message for="countryId" style="color:red;"/>
<h:commandButton
value="Order"/>
<f:facet name="footer">
<h:outputText value="Last updated: October 17, 2015"
style="font-size:10px;"/>
</f:facet>
</h:panelGrid>
</h:form>
Styling a table using CSS class
<h:form>
<h:panelGrid columns="3" class="panelGrid-css">
<f:facet
name="header">
Place your
order below
</f:facet>
<h:outputLabel for="nameId" value="Name:"/>
<h:inputText id="nameId"
required="true"/>
<h:message for="nameId"
style="color:red;"/>
<h:outputLabel for="emailId"
value="E-mail:"/>
<h:inputText id="emailId"
required="true"/>
<h:message for="emailId" style="color:red;"/>
<h:outputLabel for="countryId"
value="Country:"/>
<h:selectOneMenu id="countryId"
required="true">
<f:selectItem
itemLabel="Romania"/>
<f:selectItem
itemLabel="Spain"/>
<f:selectItem
itemLabel="Italy"/>
</h:selectOneMenu>
<h:message for="countryId" style="color:red;"/>
<h:commandButton value="Order"/>
<f:facet
name="footer">
<h:outputText value="Last updated: October 17, 2015"
style="font-size:10px;"/>
</f:facet>
</h:panelGrid>
</h:form>
CSS sample:
.panelGrid-css, .panelGrid-css td {
border-collapse:collapse;
background-color:#eee;
border:1px
solid #000;
padding:3px
5px;
}
.panelGrid-css th {
background-color:#ccc;
}
.panelGrid-css tfoot td {
background-color:#ccc;
text-align:right;
font-size:12px;
}
Dynamic table rows
<h:panelGrid columns="6"
class="panelGrid-css">
<f:facet
name="header">
WTA Singles
Rankings
</f:facet>
<c:forEach
items="#{playerBean.players}" var="player">
<h:column>
#{player.rank}
</h:column>
<h:column>
#{player.name}
</h:column>
<h:column>
#{player.country}
</h:column>
<h:column>
#{player.dateOfBirth}
</h:column>
<h:column>
#{player.points}
</h:column>
<h:column>
#{player.tournaments}
</h:column>
</c:forEach>
<f:facet
name="footer">
Last
updated: #{playerBean.today.toLocaleString()}
</f:facet>
</h:panelGrid>
The PlayerBean is (Player is just a simple bean, not listed here):
@Named
@RequestScoped
public class PlayerBean {
private final
List<Player> players;
private final
Date today;
public
PlayerBean() {
today = new
Date();
players =
new ArrayList<>();
players.add(new Player(1, "Serena Williams", "United
States", "26 Sep 1981", 11285, 15));
players.add(new Player(2, "Simona Halep", "Romania",
"27 Sep 1991", 6580, 18));
players.add(new Player(3, "Maria Sharapova",
"Russia", "19 Apr 1987", 4691, 17));
players.add(new Player(4, "Garbine Muguruza",
"Spain", "08 Oct 1993", 4690, 20));
players.add(new Player(5, "Petra Kvitova", "Czech
Republic", "08 Mar 1990", 3860, 19));
players.add(new Player(6, "Agnieszka Radwanska",
"Poland", "06 Mar 1989", 3515, 23));
}
public
List<Player> getPlayers() {
return
players;
}
public Date
getToday() {
return
today;
}
}
Do not try to obtain the same thing via <ui:repeat>.
While <c:forEach>
is a view build time tag, the <ui:repeat> is a render time tag. With
other words, <ui:repeat>
is a component handler, while <c:forEach> is a tag handler, so you
have to pay attention when you choose between them! In case of <ui:repeat>,
the <h:panelGrid>
will contain a single child, which is that <ui:repeat>. In case
of <c:forEach>,
the <h:panelGrid>
will have n children (one for each
iteration).
Nested panel grids
<h:form>
<h:panelGrid
columns="3" class="panelGrid-css">
<f:facet
name="header">
Place your
order below
</f:facet>
<h:outputLabel for="nameId" value="Name:"/>
<h:inputText id="nameId" required="true"/>
<h:message for="nameId" style="color:red;"/>
<h:outputLabel for="emailId" value="E-mail:"/>
<h:inputText id="emailId" required="true"/>
<h:message for="emailId"
style="color:red;"/>
<h:outputLabel for="countryId"
value="Country:"/>
<h:selectOneMenu id="countryId"
required="true">
<f:selectItem itemLabel="Romania"/>
<f:selectItem itemLabel="Spain"/>
<f:selectItem itemLabel="Italy"/>
</h:selectOneMenu>
<h:message for="countryId"
style="color:red;"/>
<h:panelGrid
columns="4">
<h:commandButton
value="Order"/>
<h:commandButton
value="Cancel"/>
<h:commandButton
value="Clear"/>
<h:commandButton
value="Back"/>
</h:panelGrid>
<f:facet
name="footer">
<h:outputText value="Last updated: October 17, 2015"
style="font-size:10px;"/>
</f:facet>
</h:panelGrid>
</h:form>
Styling table header and footer using CSS classes
<h:panelGrid columns="6" headerClass="header"
footerClass="footer">
<f:facet
name="header">
WTA Singles
Rankings
</f:facet>
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText
value="United States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
...
<f:facet
name="footer">
Last
updated: October 17, 2015
</f:facet>
</h:panelGrid>
CSS sample:
.header {
background-color:#6cf;
color:#444;
}
.footer {
background-color:#9ff;
font-size:12px;
color:#444;
}
Individual row styles in a table
<h:panelGrid columns="6" rowClasses="first,second,third">
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText value="United
States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
<h:outputText value="2"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText
value="Romania"/>
<h:outputText value="27 Sep
1991"/>
<h:outputText value="6580"/>
<h:outputText value="18"/>
...
</h:panelGrid>
CSS sample:
.first {
background-color:#ffc;
}
.second {
background-color:#cfc;
}
.third {
background-color:#fcc;
}
Individual column styles in a table
<h:panelGrid columns="6" columnClasses="first,second,third">
<h:outputText value="1"/>
<h:outputText value="Williams, Serena"/>
<h:outputText value="United States"/>
<h:outputText value="26 Sep 1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
<h:outputText value="2"/>
<h:outputText value="Halep, Simona"/>
<h:outputText value="Romania"/>
<h:outputText value="27 Sep 1991"/>
<h:outputText value="6580"/>
<h:outputText value="18"/>
...
</h:panelGrid>
CSS sample:
.first {
background-color:#ffc;
}
.second {
background-color:#cfc;
}
.third {
background-color:#fcc;
}
Adding cell spacing and padding to a table
<h:panelGrid columns="6" cellspacing="30" cellpadding="15"
class="custom">
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText value="United
States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText
value="15"/>
<h:outputText value="2"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText
value="Romania"/>
<h:outputText value="27 Sep
1991"/>
<h:outputText value="6580"/>
<h:outputText
value="18"/>
...
</h:panelGrid>
CSS sample:
.custom {
background-color:#999;
}
.custom td {
background-color:#eee;
border:1px
solid #000;
}
Different alignment styles in a table cell (I)
<h:panelGrid columns="6" class="td-size"
columnClasses="text-left,text-center,text-right,
text-vbottom,text-vmiddle,text-vtop">
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText
value="United States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
<h:outputText value="2"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText
value="Romania"/>
<h:outputText value="27 Sep
1991"/>
<h:outputText value="6580"/>
<h:outputText value="18"/>
<h:outputText value="3"/>
<h:outputText value="Sharapova, Maria"/>
<h:outputText value="Russia"/>
<h:outputText value="19 Apr
1987"/>
<h:outputText value="4691"/>
<h:outputText value="17"/>
</h:panelGrid>
CSS sample:
.td-size td {
border:1px
solid #000;
width:150px;
height:100px;
}
.text-left {
text-align:left;
}
.text-center {
text-align:center;
}
.text-right {
text-align:right;
}
.text-vbottom {
vertical-align:bottom;
}
.text-vmiddle {
vertical-align:middle;
}
.text-vtop {
vertical-align:top;
}
Different alignment styles in a table cell (II)
<h:panelGrid columns="6" class="td-size"
columnClasses="text-topleft,text-topcenter,
text-topright,text-bottomleft,text-bottomcenter,text-bottomright">
<h:outputText value="1"/>
<h:outputText
value="Williams, Serena"/>
<h:outputText value="United
States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
<h:outputText value="2"/>
<h:outputText
value="Halep, Simona"/>
<h:outputText
value="Romania"/>
<h:outputText value="27 Sep
1991"/>
<h:outputText value="6580"/>
<h:outputText value="18"/>
<h:outputText value="3"/>
<h:outputText
value="Sharapova, Maria"/>
<h:outputText value="Russia"/>
<h:outputText value="19 Apr
1987"/>
<h:outputText value="4691"/>
<h:outputText value="17"/>
</h:panelGrid>
CSS sample:
.td-size td {
border:1px
solid #000;
width:150px;
height:100px;
}
.text-topleft {
text-align:left;
vertical-align:top;
}
.text-topcenter {
text-align:center;
vertical-align:top;
}
.text-topright {
text-align:right;
vertical-align:top;
}
.text-bottomleft {
text-align:left;
vertical-align:bottom;
}
.text-bottomcenter {
text-align:center;
vertical-align:bottom;
}
.text-bottomright {
text-align:right;
vertical-align:bottom;
}
Setting a vertical text-direction in cells
<h:panelGrid columns="2" class="td80"
columnClasses="vertical-rl,vertical-lr">
<h:outputText value="Williams,
Serena"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText value="Halep,
Simona"/>
<h:outputText value="Sharapova,
Maria"/>
<h:outputText value="Sharapova,
Maria"/>
</h:panelGrid>
<!-- NOTE -->
<br/>
<p
class="vertical-lr" style="height:100px">
For Chrome
and Opera, 'writing-mode' vertical-rl and
vertical-lr
is currently not supported inside table cells.
</p>
<br/><br/>
<p
class="vertical-rl" style="height:100px">
For Chrome and Opera, 'writing-mode'
vertical-rl and
vertical-lr is currently not supported inside
table cells.
</p>
CSS sample:
.td80 td {
border:1px
solid #000;
width:80px;
height:80px;
}
.vertical-rl {
-ms-writing-mode:tb-rl;
-webkit-writing-mode:vertical-rl;
-moz-writing-mode:vertical-rl;
-ms-writing-mode:vertical-rl;
writing-mode:vertical-rl;
}
.vertical-lr {
-ms-writing-mode:tb-lr;
-webkit-writing-mode:vertical-lr;
-moz-writing-mode:vertical-lr;
-ms-writing-mode:vertical-lr;
writing-mode:vertical-lr;
}
Mozilla Firefox | Google Chrome |
Center a table horizontally
<h:panelGrid columns="6" class="centerHorizontally">
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText
value="United States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
...
</h:panelGrid>
CSS sample:
.centerHorizontally {
border:1px
solid #000;
position:relative;
width:500px;
height:200px;
margin-left:-250px;
left:50%;
}
Center a table horizontally and vertically
<h:panelGrid columns="6" class="centerOnScreen">
<h:outputText
value="1"/>
<h:outputText
value="Williams, Serena"/>
<h:outputText
value="United States"/>
<h:outputText
value="26 Sep 1981"/>
<h:outputText
value="11285"/>
<h:outputText
value="15"/>
...
</h:panelGrid>
CSS sample:
.centerOnScreen {
border:1px
solid #000;
position:absolute;
width:500px;
height:200px;
margin-left:-250px;
margin-top:-100px;
top:50%;
left:50%;
}
Set table background and border
<h:panelGrid columns="6" border="3"
bgcolor="orange">
<h:outputText
value="1"/>
<h:outputText
value="Williams, Serena"/>
<h:outputText
value="United States"/>
<h:outputText
value="26 Sep 1981"/>
<h:outputText
value="11285"/>
<h:outputText
value="15"/>
...
</h:panelGrid>
Set table caption
<h:panelGrid columns="6"
border="1">
<f:facet name="caption">
WTA
Singles Rankings
</f:facet>
<h:outputText value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText value="United
States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
...
</h:panelGrid>
Styling table caption, header and footer with CSS classes
<h:panelGrid columns="6"
border="1" headerClass="header"
footerClass="footer" captionClass="caption">
<f:facet
name="caption">
WTA Singles
Rankings
</f:facet>
<f:facet
name="header">
First six positions
</f:facet>
<h:outputText
value="1"/>
<h:outputText value="Williams,
Serena"/>
<h:outputText value="United
States"/>
<h:outputText value="26 Sep
1981"/>
<h:outputText value="11285"/>
<h:outputText value="15"/>
...
<f:facet
name="footer">
Last updated: October 17, 2015
</f:facet>
</h:panelGrid>
CSS sample:
.header {
background-color:#6cf;
color:#444;
}
.footer {
background-color:#9ff;
font-size:12px;
color:#444;
}
.caption{
background-color: aqua;
font-style:
inherit;
font-weight:
bolder;
}
There is also available the captionStyle attribute
for inline CSS code, and <f:facet> supports the class
attribute for indicating CSS classes for header, footer and caption.
Complete source code on GitHub.
See also Mkyong.com.
More resources on Constantin Alin, ZEEF page.
PanelGrid in JSF Extension on JSF ShowCase ZEEF page.
See also Mkyong.com.
More resources on Constantin Alin, ZEEF page.
PanelGrid in JSF Extension on JSF ShowCase ZEEF page.
Niciun comentariu :
Trimiteți un comentariu