panelGrid的使用方法和样式的格式法

本文介绍JSF中panelGrid的使用方法,包括基本结构、样式控制、合并拆分及元素对齐技巧。通过实例展示了如何利用CSS实现多样化的布局效果。
 panelGrid的使用方法及样式的格式法

  一、初识panelGrid和与之相关的设计元素

  panelGrid相当于HTML的表格,在设计中与之相关的组件有panelGrop,与之相配合的CSS

设计元素有styleClass、headerClass、footerClass、rowClasses、columnClasses。这些元

素的有机组合,可以设计出不同的输出画面。

  在HTML网页设计中,表格有<table><tr><td>等标记符号,也可以在标记符号内嵌入CSS控

制语句来控制输出的表现形式。JSF中的panelGrid虽然与HTML表格相对应,但是二者在设计时

还是有很大差异的。例如我们假设有一个HTML的表如下:

<table>
  <tr>
    <td>...</td>
    <td>...</td>
  </tr>

  <tr>
    <td>...</td>
    <td>...</td>
  </tr>
</table>

则panelGrid与之对应的标记是:

<h:panelGrid column="2">
...
...
...
...

</h:panelGrid>

它只有外壳标记,没有行控制和列控制标记。

  熟悉HTML编程的道人一眼就看出,只有外壳标记,你该怎样控制行或列的输出样式呢?别

急,JSF设计者已经想到了,他们设计出

了styleClass、headerClass、footerClass、rowClasses、columnClasses这些设计元素来控

制行与列的输出样式,其中styleClass是格式表格总的外观的,如表格的长与宽、外边框样式

、表格的背景样式等。headerClass、footerClass分别是控制表

的header和footer的。rowClasses和columnClasses分别是控制表格的行与列样式的。

  还是举个例子说一下,我们有下例:

<h:panelGrid columns="1" cellpadding="5"
      styleClass="styleClazz"
      headerClass="headerClazz"
      footerClass="footerClazz"
      rowClasses="row1,row2"
      columnClasses="column1"
      >

  <f:facet >
    <h:outputText value="您好,朋友!"/>
  </f:facet>

    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>

  <f:facet >
    <h:outputText value="您好,朋友!"/>
  </f:facet>
</h:panelGrid>

  这就是一个表格,columns="1",规定这个表只有一列,cellpadding="5"说明了边框外线

与内线的距离是5个像素。这个表由一个头部、一个尾部和中间表身三部分组成。headerClass

是格式头部样式的,footerClass是格式尾部样式的,rowClasses和columnClasses是格式行与

列样式的。 rowClasses="row1,row2"规定了表格的行与行交替使用row1和row2样式类来格式

输出样式,同样,列也是,并且还可以用3个、4个或更多个row3、row4...来依序交替格式输

出样式。

对应的样式类可以像以下这样编写在css文件中:


/*styleClass处于父类的地位,headerClazz,rowClasses等的字体设置取em时,
其在屏幕上显示的大小会参照该类字体的大小设置而放大或缩小*/

.styleClazz{
  font-size:1em;
  color:blue;
  border-style:solid;
  border-color:red;
  border-width: 1px;
}

.headerClazz{
  background-color:#3F536B;
  font-family:宋体;
  font-size:1.5em;
  color:white;
  text-align:center;
}

.footerClazz{
  background-color:#3F536B;
  font-family:宋体;
  font-size:1.5em;
  color:white;
  text-align:center;
}

/* 当行样式与列样式都用时,则行样式服从于列样式
边框的颜色需要在columnClasses中定义,
在rowClasses中定义不起作用
*/

.row1{
  background-color:#FFFFFF;
}

.row2{
  background-color:#C9D3E0;
}

.column1{
  border-style:solid;
  border-color:red;
  border-width: 1px;
}

.column2{
}

你可以用CSS在JSP中的语法将其编写在JSP文件中。

  二、panelGrid如何来格式成具有拆分合并样式的表

  这要用到panelGrop,它的作用是将封装在内的元件作为一个元件来看待,如果panelGrop

中封装了一个panelGrid,则被封装的表放在其他表中就相当于一个子表。通过paneGrop来封

装各UI组件的办法,可以实现表格的拆分目的。

<h:panelGrop>
  <h:panelGrid>
   ...
  </h:panelGrid>
</h:panelGrop>

或者:

<h:panelGrop>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
</h:panelGrop>

它们在容器中相当于一个显示元件(好像本来是一个人住一间房,现在是更多的人住一间房)。

  三、如何在panelGrid中实现设计元素对齐

  panelGrid是通过CSS语言来格式输出样式的,在CSS语言中可用vertial-align:...;来格

式输出元素纵向对齐,使用text-align:...;来实现输出元素横向对齐。其中text-align有点

迷糊人,因为从字面看它应该是针对文本的,其实它对其他元素也起作用。

  在对齐的设计中有个居中对齐的问题容易绕人。在HTML中可用<center>...</center>来实

现被封装的视图元素居中,但在CSS中好像没有类似语句。其实还是有的,只不过绕了一个弯

。你想啊,说到居中,那究竟是在多宽的范围内居中?是我这个元素在封装我的容器中居中,

还是被我封装的元素在我这个容器中居中?这个问题CSS与HTML处理语义是不样的。

在HTML中表格居中是:
<table align="center">
...
</table>

表格在这里的居中是指这个表格“我”在封装我的容器<body>中居中,具体表现为在屏幕上居

中,但是您不能通过

<h:panelGrid align="center">
...
</h:panelGrid>

来实现panelGrid在<body>中居中。因为panelGrid标记根本不支持这个语句。还是要通过CSS

来实现。下面这个使用CSS语句描述居中的语义与HTML使用align="center"语义不同。

<h:panelGrid style="text-align:center">
  <h:outputText value="您好,朋友!"/>
</h:panelGrid>

这个语句说的是me这个对象在panelGrid p 中居中,而不是指表格在<body>(屏幕)中居中。我

要在屏幕中居中怎么办?有两种办法,一种是通过在<body>中加入格式说明,第二种办法是在

panelGrid的外面再套一个panelGrid。即:


<h:panelGrid style="text-align:center;width=979px;">

  <h:panelGrop>
   <h:panelGrid style="text-align:center">
    <h:outputText value="您好,朋友!您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
    <h:outputText value="您好,朋友!"/>
   </h:panelGrid>
  </h:panelGrop>

</h:panelGrid>

这样就实现了被封装的panelGrid B 在 A 中居中,注意,这里的width=979px;是必须的,它

规定了居中是在多宽的范围内居中!数字多少可以调整,但是你不能不写这个约定,否则,被

封装在里面的panelGrid还是不会在屏幕上居中。

  还有一点注意,里面panelGrid B 的text-align继承外面panelGrid A 中的text-align属

性的约定,即里面的panelGrid不写style="text-align:center",对象me们也会在里

面panelGrid中居中。但是里面的panelGrid不继承外面的width,像上面,里面panelGrid的显

示宽度与最长的me1有关,而不是外面panelGrid A的宽度979px。

  四、其他
  ■当屏幕的显式格式是1024 X 768 时,最外面的panelGrid宽度取979px是屏幕最大化时

底部滚动条由出现到不出现的临界值,如超过979则滚动条就会出现。
  ■可以按照是对<table><tr>还是对<td>起作用的CSS类,进行封装。如写在style语句中

,则形如下:

<h:panelGrid style="width:240px;vertial-align:top;text-align:center;">
...
</h:panelGrid>

 
### `h:panelGrid` 的基本用途与结构 `h:panelGrid` 是 JSF(JavaServer Faces)中的一个布局组件,用于以表格形式组织页面中的 JSF 组件。该组件会生成 HTML 中的 `<table>` `<tr>`、`<td>` 等标签,将内容按行列排列,从左到右,从上到下填充内容[^1]。 `h:panelGrid` 支持 `columns` 属性,用于指定每行显示的列数。例如,若设置 `columns="3"`,则组件会自动将子元素按三列排列,不足时自动换行。此外,`h:panelGrid` 还支持 `border`、`cellpadding`、`cellspacing` 等与 HTML 表格相关的属性,用于控制表格的外观样式[^4]。 ### 使用 `h:panelGrid` 的基本示例 以下是一个典型的 `h:panelGrid` 使用示例,展示了如何在 JSF 页面中使用该组件来组织输入表单: ```xml <h:panelGrid columns="3" border="1" style="border-collapse: collapse;"> <h:outputText value="用户名:" /> <h:inputText value="#{user.username}" /> <h:message for="username" /> <h:outputText value="密码:" /> <h:inputSecret value="#{user.password}" /> <h:message for="password" /> <h:outputText value="确认密码:" /> <h:inputSecret value="#{user.confirmPassword}" /> <h:message for="confirmPassword" /> <h:commandButton value="注册" action="#{user.register}" /> </h:panelGrid> ``` 上述代码生成一个三列布局的表单,每行包含一个标签、一个输入组件一个错误消息区域。`border="1"` 用于显示边框,而 `style="border-collapse: collapse;"` 用于控制表格边框合并,使表格更美观[^3]。 ### 样式与响应式布局控制 `h:panelGrid` 支持通过 `style` `styleClass` 属性进行样式控制,允许开发者结合 CSS 进行响应式设计。例如,可以通过外部 CSS 类控制表格的宽度、边距、字体大小等: ```xml <h:panelGrid columns="2" styleClass="custom-grid"> <h:outputText value="用户名:" /> <h:inputText value="#{user.username}" /> <h:outputText value="密码:" /> <h:inputSecret value="#{user.password}" /> </h:panelGrid> ``` 在 CSS 文件中定义 `.custom-grid` 类: ```css .custom-grid { width: 100%; border-collapse: collapse; } .custom-grid td { padding: 8px; border: 1px solid #ccc; } ``` 这种方式使 `h:panelGrid` 更加灵活,能够适应不同的页面布局需求,并支持响应式设计[^4]。 ### 与托管 Bean 的数据绑定 虽然 `h:panelGrid` 主要用于布局,但也可以与托管 Bean 进行数据绑定,实现动态控制列数或样式: ```java @ManagedBean @RequestScoped public class GridBean { private int columnCount = 2; private String gridStyle = "border: 1px solid black;"; public int getColumnCount() { return columnCount; } public void setColumnCount(int columnCount) { this.columnCount = columnCount; } public String getGridStyle() { return gridStyle; } public void setGridStyle(String gridStyle) { this.gridStyle = gridStyle; } } ``` 在页面中使用绑定属性: ```xml <h:panelGrid columns="#{gridBean.columnCount}" style="#{gridBean.gridStyle}"> <h:outputText value="项目1" /> <h:outputText value="值1" /> <h:outputText value="项目2" /> <h:outputText value="值2" /> </h:panelGrid> ``` 通过这种方式,`h:panelGrid` 可以实现更高级的动态布局控制[^4]。 ### 常见问题与解决方案 #### 问题 1:如何控制 `h:panelGrid` 的列数? `h:panelGrid` 提供了 `columns` 属性来控制每行显示的列数。如果未指定该属性,则默认为一列。例如: ```xml <h:panelGrid columns="3"> <h:outputText value="A" /> <h:outputText value="B" /> <h:outputText value="C" /> <h:outputText value="D" /> </h:panelGrid> ``` 上述代码将生成一个 3 列的表格,自动换行为两行(前三列,第四列在下一行)[^4]。 #### 问题 2:如何去除 `h:panelGrid` 的边框? 如果不希望显示边框,可以省略 `border` 属性,或者将其设置为 `0`: ```xml <h:panelGrid columns="2" border="0"> <h:outputText value="用户名:" /> <h:inputText value="#{user.username}" /> </h:panelGrid> ``` #### 问题 3:如何自定义 `h:panelGrid` 的样式? 可以通过 `style` 或 `styleClass` 属性设置样式。例如: ```xml <h:panelGrid columns="2" style="background-color: #f9f9f9;"> <h:outputText value="用户名:" /> <h:inputText value="#{user.username}" /> </h:panelGrid> ``` 或者结合 CSS: ```xml <h:panelGrid columns="2" styleClass="custom-style"> ... </h:panelGrid> ``` #### 问题 4:`h:panelGrid` 是否支持响应式布局? `h:panelGrid` 本身不提供响应式特性,但可以通过 CSS 的媒体查询实现响应式布局。例如: ```css @media (max-width: 600px) { .custom-grid { width: 100%; } .custom-grid td { display: block; width: 100%; } } ``` 这样可以在小屏幕上将表格列垂直堆叠,提升移动端显示效果[^4]。 --- ### 注意事项 - **性能优化**:虽然 `h:panelGrid` 提供了布局便利,但过多嵌套可能影响页面渲染性能,建议合理使用。 - **替代方案**:对于现代前端开发,可以考虑使用 CSS Grid 或 Flexbox 替代 `h:panelGrid`,以获得更灵活的布局能力。 - **兼容性**:确保浏览器兼容性,特别是在使用复杂的样式响应式设计时。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值