答えのヒントがすでにあるのに、なぜ質問を投稿することにしたのか、私にはよくわかりません。しかし、誰も質問への答えを引き受けることに決めなかったので、私はそれをします。
基本的に、あなたがしなければならないのは、並べ替えられたリストのインデックスの計算をコマンドボタンのonclickイベントに結び付け、アクションメソッドで新しい順序を取得して並べ替えられたリストを処理することです。注文を維持するためにマネージドBeanの専用フィールドを使用しましたが、それは絶対に不要です。以下の敵はセットアップです。
ビュー:
<h:head>
<h:outputScript name="js/pf.js" target="body"/>
<script src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js"></script>
</h:head>
<h:body>
<h:form id="form">
<p:dataTable id="table" var="data" value="#{sortableDatatableBean.list}" widgetVar="tabSort" rowIndexVar="rowIndex">
<p:column headerText="##">
<h:outputText styleClass="row" value="#{rowIndex}"/>
</p:column>
<p:column headerText="Name">
<h:outputText value="#{data.name}" />
</p:column>
<p:column headerText="Value">
<h:outputText value="#{data.value}" />
</p:column>
</p:dataTable>
<h:inputHidden id="order" value="#{sortableDatatableBean.order}"/>
<p:commandButton value="Submit" ajax="false" onclick="return doOrder()" action="#{sortableDatatableBean.action}"/>
</h:form>
</h:body>
javascript(pf.js
):
$(document).ready(function() {
$(tabSort.jqId + '.ui-datatable tbody').sortable();
$(tabSort.jqId + '.ui-datatable tbody').disableSelection();
});
function doOrder() {
var order = '';
var len = $('.row').length;
$('.row').each(function(index) {
order += ($(this).text() + ((index == (len - 1)) ? '' : ';'));
});
$('#form\\:order').val(order);
return true;
}
管理対象Bean:
@ManagedBean
@RequestScoped
public class SortableDatatableBean {
private String order = "0;1";//getter+setter
private List<Data> list;//getter+setter
public SortableDatatableBean() {
list = new ArrayList<Data>();
Data d;
d = new Data("name", "value");
list.add(d);
d = new Data("name1", "value1");
list.add(d);
}
public String action() {
//String order = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("form:order");
List<Data> reordered = new ArrayList<Data>();
for(String s : order.split(";")) {
try {
Integer i = Integer.parseInt(s);
Data data = list.get(i);
reordered.add(data);
} catch(NumberFormatException nfe) {
}
}
this.list = reordered;
return null;
}
}
モデル:
public class Data {
private String name;
private String value;
public Data() {
}
public Data(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}