问题症状表明一个常见的初学者错误:将其声明为<h:panelGrid> 的直接子代。像这样:
<h:panelGrid columns="1">
<h:inputText ... />
<h:inputText ... />
<h:inputHidden ... />
<h:inputText ... />
</h:panelGrid>
<h:panelGrid> 生成 HTML <table> 和 as documented,它会将 每个直接子代 放入自己的表格单元格 <td>。生成的 HTML 输出如下所示:
<table>
<tbody>
<tr><td><input type="text" /></td></tr>
<tr><td><input type="text" /></td></tr>
<tr><td><input type="hidden" /></td></tr>
<tr><td><input type="text" /></td></tr>
</tbody>
</table>
<td> 默认有一些边距和填充,这完全解释了你的问题。在浏览器的内置开发人员工具集中检查 HTML 输出和 CSS 样式时,您应该已经注意到了(按 F12 或右键单击,检查元素)。
您基本上希望将<h:inputHidden> 与所需的<h:inputText> 组合在同一个表格单元格中。你可以使用<h:panelGroup>。
<h:panelGrid columns="1">
<h:inputText ... />
<h:panelGroup>
<h:inputText ... />
<h:inputHidden ... />
</h:panelGroup>
<h:inputText ... />
</h:panelGrid>
这将在生成的 HTML 输出中结束,如下所示,完全符合您的意图:
<table>
<tbody>
<tr><td><input type="text" /></td></tr>
<tr><td><input type="text" /><input type="hidden" /></td></tr>
<tr><td><input type="text" /></td></tr>
</tbody>
</table>
与具体问题无关,使用表格进行布局和定位是不好的。使用 div 和 CSS。