我正在使用CellTable来显示我的记录,但现在我想在用户点击单元格时显示一个选择框.还有一件事是选择框是我自己的小部件,而不是预定义的.你能告诉我任何这样做的方法吗?
我想将GWT编辑器框架与CellList一起使用.我的数据模型如下所示:
public class CarDto {
private String name;
private List<String> features;
// getter and setter
}
Run Code Online (Sandbox Code Playgroud)
在这里使用GWTP是我的演示者的一部分:
public class Presenter {
public interface MyView extends View, Editor<CarDto> {
}
private final SimpleBeanEditorDriver<CarDto, ?> editorDriver;
public Presenter(...) {
editorDriver = getView().createEditorDriver();
}
...
@Override
public void saveButtonClicked() {
CarDto carDto = editorDriver.flush();
int size = carDto.getFeatures().size(); // result is 0
}
}
Run Code Online (Sandbox Code Playgroud)
我的View类:
public class CarView implements Presenter.MyView {
public interface EditorDriver extends SimpleBeanEditorDriver<CarDto, CarView> {
}
@Path(value="name")
@UiField
TextBox nameInput; …Run Code Online (Sandbox Code Playgroud) 如果我在MyView.ui.xml UiBinder文件中定义我的CellTable,如下所示:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:c="urn:import:com.google.gwt.user.cellview.client"
ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat'
ui:generateKeys='com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator'
ui:generateLocales='default' xmlns:p1="urn:import:com.google.gwt.user.cellview.client">
...
<g:HTMLPanel>
<c:CellTable
addStyleNames='{style.cellTable}'
pageSize='15'
ui:field='cellTable' width="100%">
</c:CellTable>
</g:HTMLPanel>
Run Code Online (Sandbox Code Playgroud)
然后programmaticaly将列添加到CellTable,一切正常.
但是为了减少样板代码,我想在我的UiBinder文件中定义表列.我试过这个:
...
<g:HTMLPanel>
<c:CellTable
addStyleNames='{style.cellTable}'
pageSize='15'
ui:field='cellTable' width="100%">
<c:TextColumn
addStyleNames='{style.titleColumn}'
ui:field="titleColumn"/>
</c:CellTable>
</g:HTMLPanel>
Run Code Online (Sandbox Code Playgroud)
但它会产生以下错误:
[ERROR] [dialective] - 找到意外的子元素Element addStyleNames ='{style.titleColumn}'ui:field ='titleColumn'>(:33)
如何使用UiBinder定义整个CellTable?
如何增加GWT细胞的细胞高度?
在mozilla firefox单元格高度适当(根据内容)但在Internet Explorer的情况下某些部分内容无法正常显示
看图像

我的Celltable.css如下:
@def selectionBorderWidth 0px;
.cellTableWidget {
border: 1px solid red;
}
.cellTableFirstColumn {
}
.cellTableLastColumn {
}
.cellTableFooter {
text-align: left;
color: #4b4a4a;
overflow: hidden;
}
.cellTableHeader { /** COLUMN HEADR TEXT */
text-align: left;
color: #4b4a4a;
overflow: hidden;
background-color: #E1E1E1;
font-family: arial, Helvetica, sans-serif;
font-size: 8pt;
font-weight: bold;
padding-left: 10px;
height: 20px;
border-bottom: #e6e6e6 1px solid;
border-left: #a6a6af 0.5px solid;
border-right: #e6e6e6 1px solid;
border-top: #a6a6af 0.5px solid;
}
.cellTableCell {
overflow: hidden;
padding-left: …Run Code Online (Sandbox Code Playgroud) 我有一个带有可排序列的GWT CellTable,非常类似于开发人员的指南示例(http://code.google.com/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting).
但是,我希望某些列按降序排序,而不是默认升序.也就是说,如果列A当前没有排序并且我点击它的标题,我希望列A在第一次单击时降序排序,在第二次单击时升序.但我仍然希望其他列按照他们目前的方式进行排序 - 在第一次点击时使用升序.
除了用于设置可排序性的Column.setSortable(boolean)方法和用于手动触发排序的ColumnSortList.push(ColumnSortInfo)方法之外,似乎没有太多控制过程.
有没有办法实现这个目标?
我对GWT很新,但到目前为止我一直在快速进步.
我有一个单元格表,其中大部分是从RPC返回的只读数据.
我在单元格表中有两列用户可以与之交互.一个是TextInputCell,一个是ButtonCell.
当用户单击ButtonCell时,我想将该行的TextInputCell中的值发送到RPC.
我有这一切工作.
我无法工作的部分是,当单击按钮(ButtonCell)时,我想要禁用该行中的按钮,直到RPC返回,然后重新启用它.我还想在RPC返回时清除该行的输入单元格中的文本.
我无法弄清楚如何获取被点击的实际ButtonCell对象或TextInputCell与它们一起使用的句柄.
任何帮助赞赏.
BQ
我有一个GWT CellTable - 它是一个非常简单的表,只有一个字符串列.
我想要做的是将此表的行拖到放置目标(实际上是另一个表).我一直试图弄清楚如何附加一个可拖动的事件,如本视频〜23:00所述.
我可以将可拖动标志设置为TRUE的CellTable元素.
我还没有这么远,但我确信我很快就会在目标表上设置drop handler时遇到类似的问题.
如果有人可以发表一个例子或指出我正确的方向,我将不胜感激.
我已经搜索了GoogleCode,GWT ShowCase,GWT Developer Notes和Google Groups,以了解如何获取/设置CompositeCell的值.没有一个明确的例子可以解释如何在CellTable中使用它.
让我们盯着一些代码......首先是抽象类......
public abstract class ToggleableGrid<T> extends CellTable<T> {
private static final String DEFAULT_TABLE_WIDTH = "100%";
private static final DisplayMode DEFAULT_MODE = DisplayMode.VIEW;
protected void setDefaults() {
setWidth(DEFAULT_TABLE_WIDTH);
// Set the message to display when the table is empty.
setEmptyTableWidget(new Label(UiMessages.INSTANCE.no_results()));
// Add a selection model so we can select cells
final SelectionModel<T> selectionModel = new MultiSelectionModel<T>();
setSelectionModel(selectionModel, DefaultSelectionEventManager.<T> createDefaultManager());
}
public void setInput(List<T> content) {
setInput(content, DEFAULT_MODE);
}
public void setInput(List<T> content, DisplayMode mode) { …Run Code Online (Sandbox Code Playgroud) 我有一个组合框,它由一个文本字段和一个带有显示建议项的CellTable的弹出窗口组成.文本字段有一个更改处理程序,用于更新CellTable的选择.
键入字符并单击已选择的建议时,将吞下第一次单击.第二次单击工作并通过CellTable.addDomHandler(...)触发选择.
知道为什么第一次点击被吞下了吗?
示例代码:
private static class SuggestFieldTextAndPopupSandbox extends SimplePanel {
private final TextField mText;
private CellTable<Handle<String>> mTable;
private SingleSelectionModel<Handle<String>> mTableSelection;
private SingleSelectionModel<Handle<String>> mSelection;
private ProvidesKey<Handle<String>> mKeyProvider = new SimpleKeyProvider<Handle<String>>();
private PopupPanel mPopup;
private List<Handle<String>> mData;
public SuggestFieldTextAndPopupSandbox() {
mData = Lists.newArrayList(new Handle<String>("AAA"), new Handle<String>("AAB"), new Handle<String>("ABB"));
mSelection = new SingleSelectionModel<Handle<String>>();
mText = new TextField();
mText.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent pEvent) {
mPopup.showRelativeTo(mText);
}
});
mText.addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent pEvent) {
mTableSelection.setSelected(startsWith(mText.getValue()), true);
}
}); …Run Code Online (Sandbox Code Playgroud) 当我启用键盘选择策略和多选时,DataGrid我遇到了这个问题.
案例1:通过鼠标和键盘进行多选
当我想通过鼠标选择多行时,我按住Ctrl键或Shift键,这很好用.默认情况下,通过键盘,此操作由提供spacebar.当我想通过键盘组合串行选择shift并spacebar做到这一点.
案例2:通过鼠标和键盘进行单选(这是问题的开始)
当我想通过鼠标选择一行时,我只是做了一个left click.如果我不抱任何的ctrl的shift关键,并做了left click,即使多行选择,它会被取消选中,仅当前行被选中.这是预期的行为,我没有任何问题.
但同样的事情是通过键盘无法实现的.无法通过键盘选择单行.如果我按下spacebar一行被选中,如果我再按spacebar一下其他行没有shift/ctrl键,它会被多选,并且前一个选定的行不会被取消选择.
我的问题是:如何通过类似于鼠标的键盘实现单一选择?
编辑:我在gwt问题中打开了这个问题.我希望他们对此做出回应.