Thursday, July 10, 2014

Re: How to render a component after setting its property without calling any implicit method in gwt?

The very first advice I can give you is to not implement it they way you have done it.

public BaseBox(String name){
  this.name=name;
  addMembers(name);
}

protected void addMembers(final String name) {
  this.name = name;
  box = createBox(name);
}

protected abstract Widget createBox(String name);

The constructor of BaseBox calls an abstract method that is implemented by a sub class of BaseBox. That means when createBox() is called, the constructor of your sub class (e.g. TextBox) has not yet been executed and fields you may set in your constructor are not initialized yet. If these fields are used in createBox() you will get NullPointerException. A constructor should never call a method that can be overridden by sub classes. To fix that you can override Widget.onLoad() which will automatically be called by GWT when the widget is added to the page. You could call your create methods in onLoad then.

Also you have used inheritance which is kind of wrong. Inheritance means "is-a" but a TextBox is not a FlowPanel (TextBox is-a BaseBox is-not-a FlowPanel). So you should use composition which means you should make your BaseBox extends Composite and then call initWidget() to initialize it with a FlowPanel. That way you hide methods that you would inherit from FlowPanel otherwise, e.g. TextBox.add(new Button()) doesn't make a lot of sense right? With composition TextBox.add() does not exist.

Next to your redraw problem: Normally you would directly apply changes, e.g. in your showTitle() method you would directly execute the corresponding code to change the widget, e.g label.setVisible(! title.isEmpty());. GWT also allows you to schedule "finally" commands that are executed at the end of the current event loop. This allows you to batch changes and only do the redrawing work once for all changes. For example take a look at LayoutPanel.add() which schedules a layout command.


-- J.

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit+unsubscribe@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment