1

テキストボックスとラベルで構成されるカスタムウィジェットを作成する際にテキストフィールドを単純に拡張し、その後テキストフィールドの機能とイベントハンドリングを継承することは可能でしょうか?

私が理解していることから、通常は Composite を拡張してから、コンストラクターに initWidget() を実装するということです。

initWidget(binder.createAndBindUi(this));

テキストフィールドを拡張するだけで同様のことができますか。

私がこれをしたい理由は、ラベル付きのインジケーターテキストフィールドを既に作成しているためですが、このカスタムウィジェットでイベントハンドリングを適用すると、どこかで使用しようとすると予期しない結果が得られます。

import com.google.gwt.core.client.GWT;

public class IndicatorTextField extends Composite implements HasText, HasKeyUpHandlers{

public interface Binder extends UiBinder<Widget, IndicatorTextField> {
}

private static final Binder binder = GWT.create(Binder.class);

public interface Style extends CssResource{
    String textStyling();
    String requiredInputLabel();
    String colorNotValidated(); 
}

@UiField Style style;
@UiField Label label;
@UiField TextBox textBox;


public IndicatorTextField()
{
    initWidget(binder.createAndBindUi(this));
}

public void setBackgroundValidateTextbox(boolean validated)
{
    if(validated)
    {
        textBox.getElement().addClassName(style.colorNotValidated());
    }
    else
    {
        textBox.getElement().removeClassName(style.colorNotValidated());
    }
}

@Override
public String getText() {
    return label.getText();
}

@Override
public void setText(String text) {
    label.setText(text);
}

@UiHandler("textBox")
public void onKeyUp(KeyUpEvent event)
{
    DomEvent.fireNativeEvent(event.getNativeEvent(), this);
}

@Override
public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {      
    //return textBox.addKeyUpHandler(handler);
    return addDomHandler(handler, KeyUpEvent.getType());
}
}
4

1 に答える 1

0

TextBoxクラスのデフォルトのコンストラクターを見てください。

/**
 * Creates an empty text box.
 */
public TextBox() {
  this(Document.get().createTextInputElement(), "gwt-TextBox");
}

テキスト入力要素を作成します。LabeledTextBox次のようなコンストラクターを使用して、カスタム クラスを作成できます。

public class LabeledTextBox extends TextBox {

    public MyTextBox() {
        super(Document.get().createDivElement());
        final DivElement labelElement = Document.get().createDivElement();
        final InputElement textBoxElement = Document.get().createTextInputElement();
        getElement().appendChild(labelElement);
        getElement().appendChild(textBoxElement);
    }

    ...

}

私はこのクラスを自分で試しませんでした。ほとんどの場合、追加の調整が必要になり、リスナーの問題などが発生する可能性があります。

サブクラス化してウィジェットを作成する必要がありますTextBoxか? Panel代わりに何らかのものを使用してみませんか?私にとっては、より簡単なアプローチです。

于 2012-08-12T13:12:27.610 に答える