0

ウィケット初心者です。ウィケットのドキュメントを読んだ後、datatable を使用してテーブルを作成することにしました。ただし、ここでは本当に助けが必要です。テーブルの行をデータテーブルで拡張可能にするにはどうすればよいですか? これはデータテーブルでは実行できず、繰り返しビューに切り替える必要があるというのは本当ですか?

HTML コード

<!DOCTYPE html>
<html lang="en"
      xml:lang="en"
      xmlns:wicket="http://wicket.apache.org>
   <head>
      <title> Wicket test </title>
   </head>
   <body>
      <table cellspacing="0" wicket:id="table"></table>
   </body>
</html>

Java コード

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.model.Model;

public class TestPage extends WebPage {
    public TestPage() {
        final UserProvider userProvider = new UserProvider();
        List<IColumn<UserProvider.Contact, String>> columns = new ArrayList<IColumn<UserProvider.Contact, String>>(2);
        columns.add(new PropertyColumn<UserProvider.Contact, String>(new Model<String>("First Name"), "name.first", "name.first"));
        columns.add(new PropertyColumn<UserProvider.Contact, String>(new Model<String>("Last Name"), "name.last", "name.last"));
        DefaultDataTable<UserProvider.Contact, String> dataTable = new DefaultDataTable<UserProvider.Contact, String>("table", columns, userProvider, 10);
        add(dataTable);
    }
}

UserProvider の Java コード

import java.util.*;
import java.io.Serializable;

import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;

public Class UserProvider extends SortableDataProvider {
    class SortableDataProviderComparator implements Comparator<Contact>, Serializable {
        public int compare(final Contact o1, final Contact o2) {
            PropertyModel<Comparable> model1 = new PropertyModel<Comparable>(o1, (String) getSort().getProperty());
            PropertyModel<Comparable> model2 = new PropertyModel<Comparable>(o2, (String) getSort().getProperty());
            int result = model1.getObject().compareTo(model2.getObject());
            if (!getSort().isAscending()) {
                result = -result;
            }
            return result;
        }
    }

    private List<Contact> list = new ArrayList<Contact>();
    private SortableDataProviderComparator comparator = new SortableDataProviderComparator();

    public UserProvder() {
        setSort("name.first", SortOrder.ASCENDING);
        list.add(new Contact(new Name("Abbie", "Zed LaBlanc Kayle Garcia")));
        list.add(new Contact(new Name("Benny", "Yellen")));
        list.add(new Contact(new Name("Charles", "Wukong Mike Alistar")));
        list.add(new Contact(new Name("Dennis Woody Tresh", "Rose")));
        list.add(new Contact(new Name("Elaine", "Poppy")));
        list.add(new Contact(new Name("Peter Jose Brian", "Jax")));
    }

    public Iterator<Contact> model(long first, long count) {
        List<Contact> newList = new ArrayList<Contact>(list);
        Collections.sort(newList, comparator);
        return newList.subList((int) first, (int) (first + count)).iterator();
    }

    public IModel<Contact> model(final Object object) {
        return new AbstractReadOnlyModel<Contact>() {
            @Override
            public Contact getObject() {
                return (Contact) object;
            }
        };
    }

    public long size() {
        return list.size();
    }

    class Contact implements Serializable {
        private final Name name;
        public Contact(final Name name) {
            this.name = name;
        }
        public Name getName() {
            return name;
        }
    }

    class Name implements Serializable {
        private String firstName;
        private String lastName;
        public Name(final String fName, final String lName) {
            firstName = fName;
            lastName = lName;
        }
        public String getFirst() {
            return firstName;
        }
        public String getLast() {
            return lastName;
        }
        public setFirst(final String firstName) {
            this.firstName = firstName;
        }
        public setLast(final String lastName) {
            this.lastName = lastName;
        }
    }
}

上記の Java コードは、オンラインの例からのものです。目標は、姓の最初の単語と名の最初の単語のみを表示するデフォルトのテーブルです。行をクリックすると展開され、行の姓名全体が表示されます。

ご意見やご提案をお寄せいただきありがとうございます。うまくいけば、データテーブルから切り替える必要はありません。

4

2 に答える 2

1

これが正しいことを理解していれば、ユーザーが行をクリックしたときに行の内容を本質的に変更したいと考えています。ここで理解しておくべき重要なことが 1 つあります。これをクライアント側で行うか、サーバー側で行うかです。

これを純粋にクライアント側で行いたい場合は、javascript を使用する必要があります。これはあなたがやりたいことではないと思うので、あまり詳しくは説明しませんが、要点は、拡張を実行する JavaScript 関数をトリガーするのBehaviorそれぞれItemにをアタッチすることです。DataTableただし、これは改札ではないため、あなたがやりたいことではないと思います。

サーバー側の wicket でこれを行う方法は複数あります。データ表現要素を変更するか (つまり、クリックを検出して表示を変更するものをデータ テーブルに入力するようにIColumnsPropertyColumnを変更する)、またはデータ ソースを変更することができます (この場合、は再レンダリング時に変更を取得します)。 )。

どちらの場合も、行アイテムにビヘイビアを追加する必要があります。次のようにします。

newRowItem()DataTableのメソッドをオーバーライドします。super メソッドを実行し、それが返されたときに、次の行に沿ってItemcustom を添付します。Behavior

@Override
protected Item<T> newRowItem(final String id, final int index, final IModel<T> model)
{
    Item rowItem = super(id, index, model);
    rowItem.add(new AjaxEventBehavior("onclick") {
         protected void onEvent(AjaxRequestTarget target) {
             //do something
         }
     }
     return rowItem;
}

先ほど //do something と書いたところで、どのアプローチをとったかによって、適切な行動を取る必要があります。私がすることは、クリックされたかどうかを追跡するためのフラグを持つカスタムモデルを使用することです。

次に、そのフラグが最も適していると判断した場所でそのフラグを使用します。表示に影響を与えることを選択した場合は、AbstractColumnオーバーライドする populate メソッドで and を使用し、フラグがチケットであるかどうかを検出して適切な値を表示するカスタム ラベルを使用します。または、モデルからオブジェクトを返すたびにフラグをチェックして、表示したい値に設定された実際のオブジェクトのコピーを返すこともできます。このメソッドを使用すると、PropertyColumn インスタンスは変更なしで引き続き機能します。

私はまだこの回答からかなり多くを残しました。詳しく説明したい場合は、コメントを残してください。

于 2014-04-16T10:45:49.453 に答える
0

Wicket でそれを行うには、 Apache Wicket Cookbookの「セルをクリック可能にする」アプローチを試します: http://www.packtpub.com/sites/default/files/1605OS-Chapter-5-Displaying-Data-Using-DataTable .pdf

リンクを作成する代わりに、モデル オブジェクトを変更します。文字列の最初の単語をすばやく取得するには、Apache Commons を使用できます。StringUtils.substringBefore(contact.getName(), "")

于 2014-04-16T05:40:52.647 に答える