将属性添加到Cell(代码中)

时间:2016-03-07 10:22:01

标签: java gwt cell placeholder gxt

我主要在代码中使用GWT。我目前有一个带有TextInputCell的列:

public class EditPanel extends Composite{

    @UiField
    protected DataGrid<MyObject> dataGrid;

    public EditPanel(final ActionHandler actionHandler){
        ...

        Column<MyObject, String> inputColumn = new Column<MyObject, String>(new TextInputCell()){
            ... // Override of the getValue
        };
        inputColumn.setFieldUpdater(...);
        this.dataGrid.addColumn(inputColumn, "Column title");

        ...
    }

    ...
}

基于this SO answer我知道我可以在GWT中的常规TextField中添加占位符文本(或任何其他属性),如下所示:

TextField myInputField = new TextField();
myInputField.getElement().setPropertyString("placeholder", "some placeholder text");

但是,在TextInputCell上,确实没有getElement()方法来检索输入字段。

在查看TextInputCell类代码时,我遇到了protected getInputElement(parent)方法,所以我设法通过以下方法获得占位符:

final TextInputCell myInputCell = new TextInputCell(){

    @Override
    protected InputElement getInputElement(final Element parent){
        final InputElement inputElement = super.getInputElement(parent);
        inputElement.setPropertyString("placeholder", "my placeholder text");
        return inputElement;
    }
};
Column<MyObject, String> inputColumn = new Column<MyObject, String>(myInputCell){
    ...
};

它有效,但我有两个问题:

  1. 显然,将它设置为这样非常难看..
  2. getInputElement(parent) - 方法最初未被调用。当我关注其中一个输入字段时,我确实获得了占位符,但默认情况下并不总是添加该属性。
  3. 有没有人有一个实际的解决方案,如何将一个属性添加到一个列的(TextInput)单元格,而不是这个丑陋的可能 -working work-around?

    编辑:我尝试过的一些事情:

    1)尝试使用getRowElement方法检索元素,例如在this SO question & answer中:

    this.dataGrid.addColumn(inputColumn, "Column title");
    if (this.dataGrid.getRowCount() > 0){
        final Element element = this.dataGrid.getRowElement(0);
        element.setProperty("placeholder", "some placeholder text");
    }
    

    这不起作用,因为getRowCount()总是返回0.我也在它之前尝试了this.dataGrid.redraw();,但它仍然返回0.

    2)将TextInputCell覆盖为 geert3 建议:

    public class MyTextInputCell extends TextInputCell{
    
        @Override
        public InputElement getInputElement(Element parent){
            return super.getInputElement(parent);
        }
    }
    

    问题?我不知道要为父参数输入什么。我确实试过this.getElement()

    MyTextInputCell textInputCell = new MyTextInputCell();
    Column<MyObject, String> inputColumn = new Column<MyObject, String>(textInputCell){
        ... // Override of the getValue
    };
    inputColumn.setFieldUpdater(...);
    this.dataGrid.addColumn(inputColumn, "Column title");
    textInputCell.getInputElement(this.getElement()).setPropertyString("placeholder", "some placeholder text");
    

    但这似乎不起作用。当我尝试thisthis.dataGridinputColumn时,它会给出错误,因为它们不被视为Elements(我也无法将它们转换为getInputElement(parent) )。

    3)使用我最初的解决方法。

    问题:我无法在页面加载时找到强制执行TextInputCell方法调用的方法,而不是在重点关注输入字段时。

    非常讨厌没有办法直接访问GWT中declare @columnName varchar(30) set @columnName = 'February' declare @year int set @year = 2016 Declare @abc varchar(max) set @abc = 'Update XYZ'+' '+ @columnName+ '= 562 WHERE Year =' +' '+ convert(varchar(6),@year)+' ' + 'AND Category = RESOLUTION'+' ' +'AND Support_KPI = P1_Gold' print @abc execute (@abc) 的InputFields ...

1 个答案:

答案 0 :(得分:0)

我一直在读细胞。这些实际上是重用的,单个Cell可以渲染自身的多个DOM实例,并且它可以处理来自多个渲染实例的事件。这意味着Cell没有一对一的关联元素,但在重用时接收“current”元素,作为“父”参数传递给多个方法。

总而言之,我认为这意味着您在问题中描述的原始解决方案似乎是一个有效的解决方案,而不是“丑陋”。