DataGrid 와 차이점
CellTable 은 기본적으로 scroller 를 제공하지 않는다. 만약 ScrollPanel 을 이용하게 되면, CellTable 의 header 가 같이 움직인다. header 가 움직이지 않는 상태로 scroller 를 제공하는 table 이 필요하다면 DataGrid 를 사용하면 된다.[ref. 2]이 때 DataGrid 의 화면이 안보이는 경우가 발생한다. 이는 CellTable 은 자신의 size 를 가지고 표현되지만, DataGrid 는 parent 의 size 를 보고 자신의 size 를 결정하기 때문이다.[ref. 3] 관련해서는 ref. 3 을 참고하도록 하자. 참고로 parent 는 LayoutPanel 을 사용해야 한다.
Key Provider
Key Provider 를 cell table 을 create 할 때 제공한다. 이 key provider 는 ProvidesKey interface 를 implement 하는 녀석이면 된다. ProvidesKey 는 특별한 것은 없고, 단순히 getKey() 라는 method 를 가지는 interface 이다.CellTable 은 generict type 이라 CellTable 을 만들때 data type(class)을 정해주게 된다.
addColumnSortHandler()
CellTable 의 header 를 누르면 정렬이 되는 기능을 위해서addColumnSortHandler()
로 sort handler 를 set 해줄 수 있다. 이 sort handler 는 ColumnSortEvent.ListHandler[T] 를 이용하면 된다. sortHandler 를 설정해 준 후에 각 column 에 대한 sort 를 위한 comparator 를 설정해 주게 된다.
// sortHandler ColumnSortEvent.ListHandler<ContactDatabase.ContactInfo> sortHandler = new ColumnSortEvent.ListHandler<ContactDatabase.ContactInfo>( ContactDatabase.get().getDataProvider().getList()); cellTable.addColumnSortHandler(sortHandler); // Add comparator Column<ContactDatabase.ContactInfo, String> firstNameColumn = new Column<.... firstNameColumn.setSortable(true); sortHandler.setComparator(firstNameColumn, new Comparator<ContactDatabase.ContactInfo>() { @Override public int compare(ContactDatabase.ContactInfo o1, ContactDatabase.ContactInfo o2) { return o1.getFirstName().compareTo(o2.getFirstName()); } }); cellTable.addColumn(firstNameColumn, "FirstName");
setSelectionModel
이 CellTable 의 row 를 선택할 수 있도록 할 수 있다.setSelectionModel()
을 이용하면 된다. SelectionModel[T] 라는 class 를 이용해서 selection model 을 만들 수 있다.
final SelectionModel<ContactDatabase.ContactInfo> selectionModel = new MultiSelectionModel<ContactDatabase.ContactInfo>( ContactDatabase.ContactInfo.KEY_PROVIDER); cellTable.setSelectionModel(selectionModel, DefaultSelectionEventManager.<ContactDatabase.ContactInfo> createCheckboxManager());
Column
CellTable 에서는 Column[T, K] 를 이용해서 colum 을 추가한다.
Column<ContactDatabase.ContactInfo, String> firstNameColumn = new Column<ContactDatabase.ContactInfo, String>(new EditTextCell()) { @Override public String getValue(ContactDatabase.ContactInfo object) { return object.getFirstName(); } };
Cell
CellTable 은 table 에서 바로 수정도 가능하게 할 수 있다. Column 을 만들 때 아래처럼 EditTextCell() 을 이용한다. 그리고 column 에 FieldUpdater 를 set 해준다.Column<ContactDatabase.ContactInfo, String> firstNameColumn = new Column<ContactDatabase.ContactInfo, String>(new EditTextCell()) { @Override public String getValue(ContactDatabase.ContactInfo object) { return object.getFirstName(); } }; // FieldUpdater firstNameColumn.setFieldUpdater(new FieldUpdater<ContactDatabase.ContactInfo, String>() { @Override public void update(int index, ContactDatabase.ContactInfo object, String value) { // Called when the user changes the value. object.setFirstName(value); ContactDatabase.get().refreshDisplays(); } });
getValue() 의 호출과정
Column 의 render() 에서 cell.render() 를 호출하게 되는데 render 에서 getValue() 를 호출하게 된다.// Column.java public void render(Context context, T object, SafeHtmlBuilder sb) { cell.render(context, getValue(object), sb); } // CustomViewImpl.java ColumnurlColumn = new Column (new TextCell()) { @Override public String getValue(DomainInfo object) { return object.getUrl(); } }; dataGrid.addColumn(urlColumn, NBusConstants.INSTANCE.domain());
그래서 custom cell 를 만들때는 render() 를 override 해서 getValue() 를 거쳐서 들어온 Object 를 처리 할 수 있게 된다. 아래 post 를 참고하자.
cell 종류
Cell 종류는 다양하다. 아래를 참고하자.References
- http://gwt.googleusercontent.com/samples/Showcase/Showcase.html#!CwCellTable
- https://groups.google.com/forum/#!topic/google-web-toolkit/FhBfPXtPVRw
- https://groups.google.com/forum/#!msg/google-web-toolkit/PBhu6RtP4G8/expzpkx8S0oJ
댓글 없음:
댓글 쓰기