データテーブルにフッターを追加したい。「合計」のような統計処理を行います。誰でもこれを行う方法を教えてもらえますか? いくつかの例を示していただければ幸いです。ありがとう!
よろしく
ここに例があります。この例では、請求書を含むテーブルを含むページを作成します。各行に 1 つの請求書。テーブルの一番下には、すべての請求書の合計が表示されるツールバーがあります。
Invoice.java (1 つの請求書を表すオブジェクト)
public class Invoice implements Serializable {
private String description;
private int sum;
public Invoice() {}
public Invoice(String description, int sum) {
this.description = description;
this.sum = sum;
}
// setters and getters
}
InvoiceDataProvider.java (テーブルのデータ プロバイダー)
public class InvoiceDataProvider implements IDataProvider {
private List<Invoice> invoices;
public InvoiceDataProvider(IModel<Double> sumModel) {
invoices = new ArrayList<Invoice>();
invoices.add(new Invoice("for rent", 550));
invoices.add(new Invoice("for phone", 25));
invoices.add(new Invoice("for insurance", 10));
// reset sumModel
sumModel.setObject(0.0);
// count the sum of invoices
for (Invoice invoice : invoices) {
sumModel.setObject(sumModel.getObject() + invoice.getSum());
}
}
@Override
public void detach() {
}
@Override
public Iterator iterator(long first, long count) {
return invoices.iterator();
}
@Override
public IModel model(final Object object) {
return new AbstractReadOnlyModel<Invoice>() {
@Override
public Invoice getObject() {
return (Invoice) object;
}
};
}
@Override
public long size() {
return invoices.size();
}
}
データ プロバイダーでは、テーブル (請求書リスト) に表示されるデータを取得します。リスト内の請求書の合計を数え、その結果をモデルに追加します。
InvoicesToolbar.java (テーブルのツールバー。ここに請求書の合計額が表示されます)
public class InvoicesToolbar extends AbstractToolbar {
private IModel<Double> sumModel;
public InvoicesToolbar(DataTable table, IModel sumModel) {
super(table);
this.sumModel = sumModel;
add(new Label("sumText", Model.of("total sum")));
add(new Label("sumNumber", sumModel));
}
}
sumModel を保存し、2 つのラベルを作成します。ラベル 'sumText' にはテキスト 'total sum' が表示され、ラベル 'sumNumber' にはモデル (sumModel) に保存されている値が表示されます。
InvoicesToolbar.html (ツールバーはパネルなので、適切な html ファイルを作成する必要があります)
<?xml version="1.0" encoding="UTF-8" ?>
<wicket:panel xmlns:wicket="http://wicket.apache.org">
<tr>
<td><span wicket:id="sumText"></span></td>
<td><span wicket:id="sumNumber"></span></td>
</tr>
</wicket:panel>
2 つのセル (テーブルには 2 つの列があります) を持つ 1 つのテーブル行を作成し、そこにテキストをレンダリングするためのウィケット ID を持つ html 要素を追加します。
DataTablePage.java (テーブルを含む Web ページ)
public class DataTablePage extends WebPage {
public DataTablePage() {
List<IColumn> columns = new ArrayList<IColumn>();
columns.add(new PropertyColumn(Model.of("description"), "description"));
columns.add(new PropertyColumn(Model.of("sum"), "sum"));
IModel<Double> sumModel = new Model<Double>(0.0);
DataTable table = new DataTable("table", columns, new InvoiceDataProvider(sumModel), 10);
table.addTopToolbar(new HeadersToolbar(table, null));
table.addBottomToolbar(new InvoicesToolbar(table, sumModel));
add(table);
}
}
列のリストを作成します (PropertyColumn - 値はオブジェクトのプロパティになります)。モデル (sumModel) を作成します。このモデルでは、最近、請求書の合計額が保存されます。そして、テーブルを作成します。このテーブル (上部) にヘッダー ツールバー (列のヘッダー) を追加し、(下部) InvoiceToolbar を追加します。
DataTablePage.html (Web ページの HTML マークアップ)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Table</title>
</head>
<body>
<table wicket:id="table"></table>
</body>
</html>
wicket-core 依存関係の上に、wicket-extensions 依存関係も必要です。コードは wicket 6.18.0 を使用してテストされました。
たとえば、ListView を使用してデータ テーブルにデータを入力するときは、後でラベルで使用される整数モデルをインクリメントする必要があります。
モデル sumModel = new Model(0); listview = 新しい ListView(...) { ... populate(ListItem アイテム) { int N = // 必要な値 sumModel.setObject(sumModel.getObject() + N); } } 追加 (リストビュー); // ... Label sumFooter = new Label("フッター", sumModel); 追加 (合計フッター);
PS: 私はこれをテストしていません。
編集 CountLabel コンポーネントもチェックする必要があります