显示动态必需字段指示符的更好方法(在我的情况下,如果字段为空则在字段旁边显示'*',如果用户输入内容则隐藏它,如果用户清除则再次显示它输入字段)? 该指标在下面的代码中称为requiredFieldHighlight。
MyValueBoxEditorDecorator.java
public class MyValueBoxEditorDecorator<T> extends Composite implements HasEditorErrors<T>,
IsEditor<ValueBoxEditor<T>>
{
interface Binder extends UiBinder<Widget, MyValueBoxEditorDecorator<?>>
{
Binder BINDER = GWT.create(Binder.class);
}
@UiField
DivElement label;
@UiField
SimplePanel contents;
@UiField
DivElement requiredFieldHighlight;
@UiField
DivElement errorLabel;
private ValueBoxEditor<T> editor;
private ValueBoxBase<T> valueBox;
/**
* Constructs a ValueBoxEditorDecorator.
*/
@UiConstructor
public MyValueBoxEditorDecorator()
{
initWidget(Binder.BINDER.createAndBindUi(this));
}
public MyValueBoxEditorDecorator(int dummy)
{
this();
valueBox = (ValueBoxBase<T>) new TextBoxTest(requiredFieldHighlight);
this.editor = valueBox.asEditor();
valueBox.addValueChangeHandler(new ValueChangeHandler<T>()
{
@Override
public void onValueChange(ValueChangeEvent<T> event)
{
MyValueBoxEditorDecorator.this.onValueChange();
}
});
contents.add(valueBox);
MyValueBoxEditorDecorator.this.onValueChange();
}
private void onValueChange()
{
T value = editor.getValue();
if (value == null)
{
requiredFieldHighlight.getStyle().setDisplay(Style.Display.INLINE_BLOCK);
return;
}
else
{
requiredFieldHighlight.getStyle().setDisplay(Style.Display.NONE);
}
}
public ValueBoxEditor<T> asEditor()
{
return editor;
}
public void setEditor(ValueBoxEditor<T> editor)
{
this.editor = editor;
}
@UiChild(limit = 1, tagname = "valuebox")
public void setValueBox(ValueBoxBase<T> widget)
{
contents.add(widget);
setEditor(widget.asEditor());
}
@Override
public void showErrors(List<EditorError> errors)
{
// this manages the content of my errorLabel UiField
}
}
UiBinder文件:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<ui:style src="common.css" />
<g:HTMLPanel width="100%">
<div ui:field="label" class="{style.label}"/>
<g:SimplePanel ui:field="contents" stylePrimaryName="{style.contents}" />
<div class="{style.errorLabel}" ui:field="errorLabel" />
<div class="{style.errorLabel} {style.requiredFieldHighlight}" ui:field="requiredFieldHighlight">*</div>
</g:HTMLPanel>
</ui:UiBinder>
我的方法的问题是,当我的屏幕初始化时(在用户与此小部件交互之前),onValueChange()将不被调用,尽管我需要MyValueBoxEditorDecorator来更新其状态'requiredFieldHighlight'! 这就是我创建TextBoxTest类的原因。我只是传递一个对指标DivElement对象的引用并重载setText + setValue。
TextBoxTest.java
public class TextBoxTest extends TextBox
{
@Override
public void setText(String text)
{
super.setText(text);
updateRequiredFieldHighlight(text);
}
private final DivElement requiredFieldHighlight;
public TextBoxTest(DivElement requiredFieldHighlight)
{
super();
this.requiredFieldHighlight = requiredFieldHighlight;
}
private void updateRequiredFieldHighlight(String withValue)
{
if (withValue != null && !withValue.isEmpty())
{
requiredFieldHighlight.getStyle().setDisplay(Style.Display.NONE);
}
else
{
requiredFieldHighlight.getStyle().setDisplay(Style.Display.INLINE_BLOCK);
}
}
@Override
public void setValue(String value, boolean fireEvents)
{
super.setValue(value, fireEvents);
updateRequiredFieldHighlight(value);
}
}
我对这种方法有几个问题。首先,它创建了对我的另一个特定类(TextBoxTest)的依赖,其次,它没有真正正常工作,因为当我使用GUI清除文本字段的内容时,GWT不会自动调用setText()!换句话说,为了使指标正常工作,我需要在TextBoxTest类中重载setText + setValue,并且必须将ValueChangeHandler添加到我的MyValueBoxEditorDecorator对象中。为什么? (以及处理文本更改的正确事件/地点在哪里?)
20150629更新:实际上setValue()在我的屏幕初始化时被调用。我的valueChangeHandler没有被触发,但是,由于GWT内部(我认为由于setValue()提供了没有fireEvents标志调用fireEvents重载与False fireEvent标志)。