Console error: "SEVERE: Server sent Vaadin 6 style updates for ...Connector

Hi everyone, I have noticed that when some custom widgets created with the Vaadin Widget wizard are rendered fine but on the browser console I get the following error:

SEVERE: Server sent Vaadin 6 style updates for …Connector (2) but this is not a Vaadin 6 Paintable

Coul someone tell me what is this error due to? How should I fix this?

Here is the code for some custom widgets that raise this error:
IntegerTextField
and
ChromaHasPasswordField
:

First

IntegerTextField

, here is the widget:

public class IntegerTextFieldWidget extends TextBox {
    public static final String CLASSNAME = "integertextfield";

    public IntegerTextFieldWidget() {
        setStyleName(CLASSNAME);
    }
}

The connector:

@Connect(IntegerTextField.class)
public class IntegerTextFieldConnector extends AbstractComponentConnector {

   private static final long serialVersionUID = 1L;

   public IntegerTextFieldConnector() {
        getWidget().addKeyPressHandler(new KeyPressHandler() {      
            @Override
            public void onKeyPress(KeyPressEvent event) {
                if (!Character.isDigit(event.getCharCode()))
                    getWidget().cancelKey();
            }
        });
    }

    @Override
    protected Widget createWidget() {
        return GWT.create(IntegerTextFieldWidget.class);
    }

   @Override 
    public IntegerTextFieldWidget getWidget() {
        return (IntegerTextFieldWidget) super.getWidget();
    }

   @Override
   public IntegerTextFieldState getState() {
        return (IntegerTextFieldState) super.getState();
   }

   @Override
   public void onStateChanged(StateChangeEvent stateChangeEvent) {
        super.onStateChanged(stateChangeEvent);
        final String text = getState().text;
        getWidget().setText(text);
    }
}

The shared state:

public class IntegerTextFieldState extends com.vaadin.shared.ui.textfield.AbstractTextFieldState {
}

And the server side component:

public class IntegerTextField extends com.vaadin.ui.TextField {

    public IntegerTextField() {
    }

    @Override
    public String getValue(){
      return getState().text;
    }

    @Override
    public void setValue(String value) {
      getState().text = value;
    }

   @Override
   public IntegerTextFieldState getState() {
        return (IntegerTextFieldState) super.getState();
    }
}

And here is the ChromaHashPasswordField component:

The widget:

public class ChromaHashPasswordFieldWidget extends Composite {

    

public static final String CLASSNAME = "chromahashpasswordfield";




private PasswordTextBox textBox = new PasswordTextBox();

    private HTML chromaHashStripes = new HTML();

    private HorizontalPanel panel = new HorizontalPanel();

    private int numberStripes = 3;

    

public ChromaHashPasswordFieldWidget() {

        initWidget(panel);

        setStyleName(CLASSNAME);

        panel.add(textBox);

        panel.add(chromaHashStripes);

    }




private String[] getChromaHash(String text, int numberStripes) {

        String salt = "du467e4aSdfe";

        text += salt;

        String[] colors = new String[numberStripes]
;

        

        int hash;

        int part = text.length() / numberStripes;

        for (int i = 0; i < numberStripes; i++) {

            hash = text.substring(part * i, 

                                 (part * i) + part).hashCode();

            colors[i]
 = "#" + intToRGB(hash);

        }

        return colors;

    }

    

public String intToRGB(int i) {

        String RGB = Integer.toHexString(((i >> 16) & 0xFF))

                   + Integer.toHexString(((i >> 8) & 0xFF))

                   + Integer.toHexString((i & 0xFF));

        while (RGB.length() < 6) {

            RGB += "0";

        }        

        return RGB;

    }

    

public void updateChromaHashStripes() {

        String[] chromaHash = getChromaHash(getText(), numberStripes);

        int height = 18;

        int width = 6;

                

        String htmlStripes = "<div style=\"margin: 3px;\">";

        for (int i = 0; i < numberStripes; i++) {

            htmlStripes += "<div style=\"background-color: "+ chromaHash[i]
 + ";"

                                      + " float: left; height: "+ height + "px;"

                                      + " width: "+ width +"px;\">" 

                          +"</div>";

        }

        htmlStripes += "</div>";

        chromaHashStripes.setPixelSize(height * 2, width * numberStripes);

        chromaHashStripes.setHTML(htmlStripes);

    }

    

public String getText() {

        return textBox.getText();

    }

    

    public void setText(String text) {
        textBox.setText(text);
    }

   public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {
        return textBox.addKeyUpHandler(handler);
    }
}

The connector:

@Connect(ChromaHashPasswordField.class)

public class ChromaHashPasswordFieldConnector extends AbstractComponentConnector {




/**

     * 

     */

private static final long serialVersionUID = 1L;

        

public ChromaHashPasswordFieldConnector() {

        getWidget().addKeyUpHandler(new KeyUpHandler() {

            @Override

             public void onKeyUp(KeyUpEvent event) {

               getWidget().updateChromaHashStripes();

             }

        });

    }




@Override

protected Widget createWidget() {

        return GWT.create(ChromaHashPasswordFieldWidget.class);

    }




@Override

public ChromaHashPasswordFieldWidget getWidget() {

        return (ChromaHashPasswordFieldWidget) super.getWidget();

    }




@Override

public ChromaHashPasswordFieldState getState() {

        return (ChromaHashPasswordFieldState) super.getState();

    }




@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
        super.onStateChanged(stateChangeEvent);
        final String text = getState().text;
        getWidget().setText(text);
        getWidget().updateChromaHashStripes();
    }
}

The shared state:

public class ChromaHashPasswordFieldState extends com.vaadin.shared.ui.textfield.AbstractTextFieldState {

    {
        primaryStyleName = null;
    }

}

And the server side component:

public class ChromaHashPasswordField extends com.vaadin.ui.PasswordField {




/**

     * 

     */

private static final long serialVersionUID = 1L;

    

public ChromaHashPasswordField() {

    }




@Override

public ChromaHashPasswordFieldState getState() {

        return (ChromaHashPasswordFieldState) super.getState();

    }

    

@Override

public String getValue() {

        return super.getValue();

    }

    

@Override

public void setValue(String value) {

        getState().text = value;

    }

}

And when I use these components, I get the above error:

[code]

@Override
protected void init(VaadinRequest request) {
VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
layout.setSpacing(true);
setContent(layout);

    layout.addComponents(new ChromaHashPasswordField(), new IntegerTextField());
}


[/code]For both:


SEVERE: Server sent Vaadin 6 style updates for ChromaHashPasswordFieldConnector but this is not a Vaadin 6 Paintable
SEVERE: Server sent Vaadin 6 style updates for IntegerTextFieldConnector but this is not a Vaadin 6 Paintable

How can I fix this?

Hi.

At a quick glance I noted that TextField and PasswordField both extend AbstractTextField that is a LegacyComponent.

Your connectors extend AbstractComponentConnector but do not implement Paintable.

The problem should go away if you just extend TextFieldConnector instead of AbstractComponentConnector.