Ответ 1
<rich:extendedDataTable>
действительно не справляется с горизонтальной прокруткой. На самом деле, похоже, разработчики решили сделать горизонтальную прокрутку практически невозможной.
Вы можете поместить <rich:extendedDataTable>
в <div>
с включенной горизонтальной прокруткой, но он не будет работать, если вы оставите его на этом. Один из вложенных <div>
в <rich:extendedDataTable>
(div.extdt-innerdiv
) абсолютно позиционируется, удаляя его из потока документа.
Для справки, это основная структура вывода <rich:extendedDataTable>
, предполагая три элемента <rich:column>
с шириной 100 пикселей и двумя записями:
<div id="form_id:edt_id" class="extdt-maindiv rich-extdt-maindiv">
<div id="form_id:edt_id:od" class="extdt-outerdiv">
<div id="form_id:edt_id:innerd" class="extdt-innerdiv">
<table id="form_id:edt_id:tu" class="extdt-table-layout">
<colgroup id="form_id:edt_id:colgroup:header">
<col width="100" />
<col width="100" />
<col width="100" />
</colgroup>
<thead id="form_id:edt_id:header" class="extdt-thead">
<tr class="extdt-subheader rich-extdt-subheader">
<th id="form_id:edt_id:column_1_id" class="extdt-menucell extdt-subheadercell rich-extdt-subheadercell">Column Header 1</th>
<th id="form_id:edt_id:column_2_id" class="extdt-menucell extdt-subheadercell rich-extdt-subheadercell">Column Header 2</th>
<th id="form_id:edt_id:column_3_id" class="extdt-menucell extdt-subheadercell rich-extdt-subheadercell">Column Header 3</th>
</tr>
<tr class="extdt-table-filterrow rich-extdt-subheader"> <!-- only if filtering is enabled -->
<th class="extdt-subheadercell rich-extdt-subheadercell"><!-- omitted for example purposes --></th>
<th class="extdt-subheadercell rich-extdt-subheadercell"><!-- omitted for example purposes --></th>
<th class="extdt-subheadercell rich-extdt-subheadercell"><!-- omitted for example purposes --></th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="3">
<div id="form_id:edt_id:sd" class="extdt-content">
<table id="form_id:edt_id:n" class="extdt-table-layout">
<colgroup id="form_id:edt_id:colgroup:body">
<col width="100" />
<col width="100" />
<col width="100" />
</colgroup>
<tbody id="form_id:edt_id:tb">
<tr id="form_id:edt_id:n:0" class="extdt-firstrow rich-extdt-firstrow">
<td id="form_id:edt_id:0:column_1_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 1, Row 1</div>
</td>
<td id="form_id:edt_id:0:column_2_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 2, Row 1</div>
</td>
<td id="form_id:edt_id:0:column_3_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 3, Row 1</div>
</td>
</tr>
<tr id="form_id:edt_id:n:1" class="extdt-firstrow rich-extdt-firstrow">
<td id="form_id:edt_id:1:column_1_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 1, Row 2</div>
</td>
<td id="form_id:edt_id:1:column_2_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 2, Row 2</div>
</td>
<td id="form_id:edt_id:1:column_3_id" class="extdt-cell rich-extdt-cell">
<div class="extdt-cell-div">Column 3, Row 2</div>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
<tfoot id="form_id:edt_id:footer">
<tr class="extdt-footer rich-extdt-footer">
<td class="extdt-footercell rich-extdt-footercell" scope="colgroup" colspan="3">
<!-- table footer goes here if defined -->
</td>
</tr>
</tfoot>
</table>
</div>
</div>
<div id="form_id:edt_id:column_1_idmenu">
<script type="text/javascript">
// context menu script snipped for example purposes
</script>
</div>
<div id="form_id:edt_id:column_2_idmenu">
<script type="text/javascript">
// context menu script snipped for example purposes
</script>
</div>
<div id="form_id:edt_id:column_3_idmenu">
<script type="text/javascript">
// context menu script snipped for example purposes
</script>
</div>
</div>
Вы можете добавить горизонтальную прокрутку к div.extdt-innerdiv
, но функция автоматического изменения размера столбца <rich:extendedDataTable>
(ExtendedDataTable.DataTable_formId_edtId.calculateWidthsFromRatios()
) по существу путается этим, изменяя размеры всех столбцов, начинающихся с компонента maxWidth
(полученного из начальной ширины от div.extdt-maindiv
) до 20px.
Я пробовал...
- Обтекание
<rich:extendedDataTable>
с помощью элемента<div>
и установка следующих параметров:-
position: relative;
-
width: 100%;
-
overflow-x: auto;
- желаемая высота, иначе вы увидите полосы прокрутки из-за следующей отметки.
-
- Создание
div.extdt-maindiv
абсолютно позиционированного - Предоставление как
div.extdt-outerdiv
, так иdiv.extdt-innerdiv
статического позиционирования и автоматической ширины
... но это, похоже, не имеет никакого эффекта.
Я думаю, что это может быть связано с тем, что я делаю большинство этих изменений в Firebug, а mainDiv.getWidth()
(из calculateWidthsFromRatios()
) извлекает кешированное значение mainDiv.element.boxWidth
. Это значение устанавливается в ClientUI.common.box.Box.setWidth()
(common-scrollable-data-table.js), и оно вызывает только один раз; он не будет вызван снова, если я изменил размер окна браузера (<rich:extendedDataTable>
в моем случае имеет 100% ширину).
Я попытаюсь внести эти изменения в свой файл CSS, чтобы узнать, все ли это работает магически. JavaScript для <rich:extendedDataTable>
довольно сложный, но он не документирован, поэтому я мог что-то упустить. Я продолжу свои результаты.
РЕДАКТИРОВАТЬ: после внесения изменений в мой CSS я все еще столкнулся с проблемой сокращения столбцов.
Итак, чтобы избежать создания div-оболочки, я добавил горизонтальную прокрутку в div.extdt-innerdiv
:
.extdt-innerdiv { overflow-y: hidden; overflow-x: auto !important; }
Затем в нижнем колонтитуле <rich:extendedDataTable>
я отключил функцию calculateWidthsFromRatios()
:
<rich:extendedDataTable id="edtId">
<!-- rest of extended data table -->
<f:facet name="footer">
<script type="text/javascript">
jQuery(function() {
// Disable ratio-based column resizing.
ExtendedDataTable.DataTable_formId_edtId.calculateWidthsFromRatios = function() {};
});
</script>
</f:facet>
</rich:extendedDataTable>
Я использовал нижний колонтитул таблицы, чтобы заставить этот JavaScript выполнять каждый раз, когда компонент перегенерирован.
Даже при таком решении пользователь не сможет вручную расширять ширину столбцов, потому что JavaScript в расширенном-data-table.js предотвращает изменение размеров столбцов более чем mainDiv.element.boxWidth
. Чтобы разрешить такое изменение размера, можно было бы просто отправить патч JBoss для исправления <rich:extendedDataTable>
, так как в настоящее время нет планов изменить его поведение в RichFaces 3.X(согласно # RF-4871 в сообществе JBoss JIRA).
Удачи.