How to use <g:DialogBox> UIBinder definition from Java

1,961 views
Skip to first unread message

Ovidiu Gheorghies

unread,
Feb 9, 2010, 6:00:53 AM2/9/10
to Google Web Toolkit
Hello,

The DialogBox API (http://google-web-toolkit.googlecode.com/svn/
javadoc/2.0/com/google/gwt/user/client/ui/DialogBox.html) notes that a
DialogBox can be defined as a UIBinder template as follows:

<g:DialogBox autoHide="true" modal="true">
<g:caption><b>Caption text</b></g:caption>
<g:HTMLPanel>
Body text
<g:Button ui:field='cancelButton'>Cancel</g:Button>
<g:Button ui:field='okButton'>Okay</g:Button>
</g:HTMLPanel>
</g:DialogBox>

What is the proper way of using this definition from Java code?
Supposing that the above definition is contained in
NotificationWindow.ui.xml, the following naive approach to
NotificationWindow.java does not work:

public class NotificationWindow extends Composite {
private static NotificationWindowUiBinder uiBinder =
GWT.create(NotificationWindowUiBinder.class);
interface NotificationWindowUiBinder extends UiBinder<Widget,
NotificationWindow> {}

@UiField DialogBox dialogBox;

public NotificationWindow() {
initWidget(uiBinder.createAndBindUi(this));
}

public void show() {
dialogBox.show();
}
}

If the EntryPoint-derived class calls:

(new NotificationWindow()).show();

then the following exception is logged:

java.lang.IllegalStateException: This widget's parent does not
implement HasWidgets

How is the <g:DialogBox> definition from the DialogBox API used
correctly from Java code?

Best regards,
Ovidiu

Christian Goudreau

unread,
Feb 9, 2010, 9:36:01 AM2/9/10
to google-we...@googlegroups.com
That's how :


Christian


--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-we...@googlegroups.com.
To unsubscribe from this group, send email to google-web-tool...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.


Thomas Broyer

unread,
Feb 9, 2010, 11:44:18 AM2/9/10
to Google Web Toolkit

There are two possibilities: inheriting DialogBox or having a
DialogBox field (but then not inheriting a Widget).

Solution #1: inheriting a DialogBox

class NotificationWindow extends DialogBox {
...

public NotificationWindow() {
// we don't care about the returned value, it'll be 'this'
uiBinder.createAndBindUi(this);
}

@UiFactory
DialogBox thatsJustMe() {
// UiBinder will call this to get a DialogBox instance
// and this is the DialogBox instance we want to use
return this;
}

...
}


Solution #2: not inheriting DialogBox

// Note: do NOT inherit Composite, Widget or UIObject!
class NotificationWindow {
...

private DialogBox dialogBox;

public NotificationWindow() {
dialogBox = uiBinder.createAndBind(this);
}

public void show() {
dialogBox.show();
}

...
}

Stefano Ciccarelli

unread,
Feb 10, 2010, 10:24:42 AM2/10/10
to google-web-toolkit
Solution #1 doesn't work for me. I get this error:

Second attempt to set initializer for field "f_DialogBox1", from "new com.google.gwt.user.client.ui.DialogBox(false, true)" to "owner.thatsJustMe()"

Hints or suggestions?


}

Christian Goudreau

unread,
Feb 10, 2010, 10:46:01 AM2/10/10
to google-we...@googlegroups.com
First, give us your code for you .java and for your .ui.xml.

I'll see what  I can do for you, I also had some problems first time I tried this. Note that I'm using Gwt-Presenter in my example.

Christian

Stefano Ciccarelli

unread,
Feb 10, 2010, 10:58:10 AM2/10/10
to google-web-toolkit
Sorry, I was talking about Thomas Broyer solution #1.
Your code (pastebin) is what I was already doing.

BTW this is the .java:

public final class AboutDialogDisplay {
    @Inject
    private AboutDialogDisplay() {
        uiBinder.createAndBindUi(this);
    }

    @UiFactory
    DialogBox thatsJustMe() {
        return this;
    }
}

And this is the .ui.xml:
<g:DialogBox animationEnabled="true" glassEnabled="true" modal="true">
    ......
</g:DialogBox>

Thanks
Stefano

Christian Goudreau

unread,
Feb 10, 2010, 11:11:51 AM2/10/10
to google-we...@googlegroups.com
In your code, for solution #1, you need to extends DialogBox, you forgot that.

For my solution, I only encapsulate DialogBox within an HTMLPanel an then I added two public function for showing and hiding my dialogbox. (Solution #2) Btw, I found solution #2 less intrusive and more simple.

Christian Goudreau

unread,
Feb 10, 2010, 11:16:26 AM2/10/10
to google-we...@googlegroups.com
Oh no his solution #2 isn't like mine at all, lol, but anyway, do you really need @Inject ? There's nothing to inject in your example.

Stefano Ciccarelli

unread,
Feb 10, 2010, 11:25:20 AM2/10/10
to google-web-toolkit
I'm already doing like you, but I'd like to try the solution #1 explained by Thomas Broyer, so the code is from that test. The class already extends DialogBox and I get the error reported, the extends is missing because I done something wrong with cut&paste.
I need @Inject because that class is the Display injected in a Presenter.

I want to try that solution because I prefer to extends DialogBox.
Reply all
Reply to author
Forward
0 new messages