EditTextCell FieldUpdater宽度

YNC*_*mak 11 java gwt

如何在字段编辑时设置文本框的宽度?

EditTextCell febCell = new EditTextCell();
Column<DTO, String> febColumn = new Column<DTO, String>(febCell){
    @Override
    public String getValue(DTO object) {
        return (String.valueOf(object.getFeb()));
    }
};
febColumn.setFieldUpdater(new FieldUpdater<DTO, String>() {
    public void update(int index, DTO object, String value) {
        System.out.println("index="+index+" resourceId="+object.getId()+" feb="+value);
    }
});
febColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LOCALE_END);
cellTable.addColumn(febColumn, "Feb");
cellTable.setColumnWidth(febColumn, 3, Unit.PCT);
Run Code Online (Sandbox Code Playgroud)

一切都运行良好,但是当我点击可编辑字段时,会出现一个非常大的文本框.那么,如何自定义此小部件以编辑数据?

如果我在PX中设置宽度而不是像PCT那样

cellTable.setColumnWidth(febColumn, 25, Unit.PX);
Run Code Online (Sandbox Code Playgroud)

编辑时单元格不会爆炸,但内部文本框仍然具有相同的长宽度,并且长字符串值隐藏在右侧后面.

好.可能我需要为每种类型的EditTextCell重新发明轮子:

MyEditTextCell extends AbstractEditableCell<String, MyEditTextCell.ViewData> ...
interface MyTemplate extends SafeHtmlTemplates {
    @Template("<input type=\"text\" value=\"{0}\" tabindex=\"-1\" size=\"{1}\" maxlength=\"{1}\" style=\"{2}\"></input>")
    SafeHtml input(String value, Integer maxLength, String style);
}
...
@Override public void render(com.google.gwt.cell.client.Cell.Context context,
                             String value, SafeHtmlBuilder sb) {...

sb.append(template.input(text, maxLegth, style));
Run Code Online (Sandbox Code Playgroud)

并使用这样的小部件:

MyEditTextCell febCell = new MyEditTextCell(SimpleSafeHtmlRenderer.getInstance(), 4, "width:35px;");
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法.

小智 1

你走在正确的轨道上。使用文本区域元素而不是输入 type="text"。我从 EditTextCell 的源开始,并在适当的位置插入了 textarea 元素而不是输入。请参阅下面的代码

public class TextAreaEditCell extends
    AbstractEditableCell<String, TextAreaEditCell.ViewData> {

interface Template extends SafeHtmlTemplates {
    @Template("<textarea tabindex=\"-1\" rows=\"{1}\" cols=\"{2}\" >{0}</textarea>")
    SafeHtml input(String value, Integer rows, Integer cols);
}
... 
private int rows, cols;

/**
 * Construct a new EditTextCell that will use a
 * {@link SimpleSafeHtmlRenderer}.
 */
public TextAreaEditCell() {
    this(SimpleSafeHtmlRenderer.getInstance(), 1, 20);
}

/**
 * Construct a new EditTextCell that will use a given
 * {@link SafeHtmlRenderer} to render the value when not in edit mode.
 * 
 * @param renderer
 *            a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
 */
public TextAreaEditCell(SafeHtmlRenderer<String> renderer, int r, int c) {
    super("click", "keyup", "keydown", "blur");
    rows = r;
    cols = c;
...
} else if ("blur".equals(type)) {
        // Commit the change. Ensure that we are blurring the input element
        // and
        // not the parent element itself.
        EventTarget eventTarget = event.getEventTarget();
        if (Element.is(eventTarget)) {
            Element target = Element.as(eventTarget);
            if ("textarea".equals(target.getTagName().toLowerCase())) {
...
/**
 * Get the input element in edit mode.
 */
private TextAreaElement getInputElement(Element parent) {
    return parent.getFirstChild().<TextAreaElement> cast();
}
...
    private String updateViewData(Element parent, ViewData viewData,
        boolean isEditing) {
    TextAreaElement input = (TextAreaElement) parent.getFirstChild();
    // InputElement input = (InputElement) parent.getFirstChild();
...
Run Code Online (Sandbox Code Playgroud)