2013-07-16 4 views
0

Я пытаюсь создать виджет, который будет отображать его связанное значение в формате, который не совпадает с собственным значением. Например, если значение (в базе данных) «abcde», я хочу показать «ab.cd.e» на экране, и если пользователь набирает «abcde», я также хочу показать «ab.cd.e ». Если пользователь набирает «ab.cd.e», тогда я хочу сохранить только «abcde» в базе данных. Я делаю это в GWT editor framework. Я попытался использовать совет из этого ответа: Converting String to BigDecimal in GWT, но я не могу заставить его работать. Вот что у меня есть в файле UiBinder:Пользовательский рендеринг в GWT

<g:TextBox ui:field='myTextBox' width='300px'/> 

И в ассоциированном Java блока:

@UiField 
TextBox myTextBox; 
... 
initWidget(binder.createAndBindUi(this)); 
new MyValueBox(myTextBox); 

А вот определение MyValueBox виджета:

public class MyValueBox extends ValueBox<String> { 

//========================================================================= 

public static class MyRenderer extends AbstractRenderer<String> { 

private static MyRenderer _instance; 

private static MyRenderer instance() { 
    if (_instance == null) { 
    _instance = new MyRenderer(); 
    } 
    return _instance; 
} 

@Override 
public String render(final String text) { 
    // validation is required before doing this! 
    return text.substring(0, 2) + "." + text.substring(2, 4) + "." 
     + text.substring(4); 
} 

} 

//========================================================================= 

public static class MyParser implements Parser<String> { 

private static MyParser _instance; 

private static MyParser instance() { 
    if (_instance == null) { 
    _instance = new MyParser(); 
    } 
    return _instance; 
} 

@Override 
public String parse(final CharSequence text) throws ParseException { 
    return "parsed string"; 
} 

} 

//========================================================================= 

public MyValueBox(final TextBox valueBox) { 
    super(valueBox.getElement(), MyRenderer.instance(), MyParser.instance()); 
} 

} 

Как вы можете видеть , Я пытаюсь обернуть TextBox, который был создан с помощью UiBinder, но я не вижу никакого эффекта от этого. Я знаю, что у меня что-то очень простое, и что есть намного более простой способ сделать это, но я в тупике. Спасибо за любые предложения!

--Edit--

В конце концов я решил использовать CellWidget, который имел дополнительное преимущество, что я могу использовать этот код в ячейке виджета (например, DataGrid), в дополнение к его использованию на панели. Я зарегистрировал свое решение здесь: GWT: A Custom Cell Example

ответ

1

Вам не хватает, чтобы объявить свой пользовательский виджет в UIBinder. Вам нужно, чтобы связать пакет декларации XML, добавив ваше к стандартной (так называемый «г»):

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:myurn='urn:import:mypackage'> 

Тогда вы должны использовать свой объявленную урну, и имя вашего класса при объявлении вашего TextBox в UiBinder:

<myurn:MyValueBox ui:field='myTextBox' width='300px'/> 

====== EDIT =====

вы должны расширить ValueBoxBase вместо оберточной TextBox, таким образом, вы получите контроль над видеообработки и Parser, как вы собираетесь , теперь вы сможете использовать свой пользовательский флажок в качестве виджета внутри UIBinder:

public class CustomText extends ValueBoxBase<String> 
{ 
    public CustomText() { 
     super(Document.get().createTextInputElement(),CustomRenderer.instance(), 
      CustomParser.instance()); 
     } 

    private static class CustomRenderer extends AbstractRenderer<String> 
    { 
     private static CustomRenderer INSTANCE; 

     public static CustomRenderer instance() {  
      if (INSTANCE == null) { 
       INSTANCE = new CustomRenderer(); 
      } 
      return INSTANCE; 
     } 

     @Override 
     public String render(String text) 
     { 
      return "rendered string"; 
     }  
    } 

    private static class CustomParser implements Parser<String> 
    { 
     private static CustomParser INSTANCE; 

     public static CustomParser instance() { 
      if (INSTANCE == null) { 
       INSTANCE = new CustomParser(); 
      } 
      return INSTANCE; 
     } 

     @Override 
     public String parse(CharSequence text) throws ParseException 
     { 
      return "parsed string"; 
     } 

    } 
} 
+0

Я не ясно, о том, как создать экземпляр MyValueBox - класс MyValueBox имеет конструктор, который принимает один аргумент, который я могу, конечно, удалить, но потом мне еще нужно вызвать унаследованный конструктор, который принимает «Элемент» в качестве первого аргумента ... как мне это сделать? –

+0

Почему вы отправляете TextBox в свой конструктор? Можно ли увидеть конструктор для MyValueBox? Однако вы можете взглянуть на http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html#Using_a_widget, чтобы узнать о передаче параметров через конструктор. – amaurs

+0

Я отправляю 'TextBox' в конструктор, чтобы обернуть' TextBox' в виджет с рендерером. Я не вижу способа переопределить рендеринг на 'TextBox'. –

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