2016-03-07 1 views
0

Я использую 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 я знаю, что могу добавить замещающий-текст (или любое другое имущество) к обычному TextField в GWT, как это:

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) -метод не называется изначально. Я получаю местозаполнитель, когда я фокусирую одно из поля ввода, но свойство не всегда добавляется по умолчанию.

У кого-нибудь есть реальное решение о том, как добавить свойство в ячейку (TextInput) Столбец, вместо этого уродливого , возможно, - рабочий процесс?


EDIT: Некоторые вещи, которые я пробовал:

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"); 

, но это не похоже на работу. И когда я пытаюсь this, this.dataGrid или inputColumn, выдается сообщение об ошибке, поскольку они не рассматриваются как Elements (и я также не могу их отличить).

3) Используя мой первоначальный обход.

Проблема: я не могу найти способ принудительного вызова метода getInputElement(parent) при загрузке страницы, а не при фокусировке поля ввода.

Довольно раздражает, что нет возможности прямого доступа к входным полям TextInputCell в GWT ...

ответ

0

Я немного читал о ячейках. Они на самом деле повторно используются, одна ячейка может отображать несколько экземпляров DOM сама по себе и может обрабатывать события из нескольких визуализированных экземпляров. Это означает, что Cell не имеет связанного с одним элементом элемента, но получает «текущий» элемент, поскольку он повторно используется, передается как «родительский» аргумент нескольким методам.

Итак, в заключение я считаю, что это означает, что оригинальное решение, которое вы описали в своем вопросе, кажется правильным решением, а не «уродливым» вообще.

Смежные вопросы