Wie kombinieren Sie mehrere uiBinder-basierten widgets?
Muss ich einfügen [Anzahl] uiBinder-basierte widgets in ein anderes, an einem bestimmten Ort. Das eingefügte widget, ist eine etwas komplizierte layout, so dass ich versuche, Sie zu definieren in HTML.
referencePanel.add(...) nicht mit java.lang.IllegalStateException: Dieses widget ist der Elternteil nicht umsetzen HasWidgets. Weiß nicht, welches widget parent, es ist unglücklich darüber - innerPanel oder referencePanel.
Wenn die ReferenceUI-Objekt Hinzugefügt RootPanel, und dann Hinzugefügt, um den unteren Rand der Seite. Aber wenn es Hinzugefügt RootPanel erste,
dann gibt es eine JavaScriptException Code 3 (HIERARCHY_REQUEST_ERR), wenn Hinzugefügt, um referencePanel.
Irgendwelche Vorschläge?
public class AppUIDemo extends Composite {
@UiTemplate("AppUIDemo.ui.xml")
interface AppUIDemoUiBinder extends UiBinder<Widget, AppUIDemo> {
}
@UiTemplate("ReferenceUI.ui.xml")
interface ReferenceUIUiBinder extends
UiBinder<Widget, ReferenceUI> {
}
private static AppUIDemoUiBinder uiBinder = GWT
.create(AppUIDemoUiBinder.class);
private static ReferenceUIUiBinder refUIBinder = GWT
.create(ReferenceUIUiBinder.class);
@UiField
FlowPanel referencePanel;
public AppUIDemo() {
initWidget(uiBinder.createAndBindUi(this));
ReferenceUI reference = new ReferenceUI(refUIBinder);
HTMLPanel innerPanel = reference.getRefPanel();
innerPanel.getElement().setId(HTMLPanel.createUniqueId());
referencePanel.add(innerPanel);
}
}
public class ReferenceUI extends Composite {
interface ReferenceUIUiBinder extends
UiBinder<Widget,ReferenceUI> {
}
private static ReferenceUIUiBinder uiBinder = GWT
.create(ReferenceUIUiBinder.class);
@UiField
HTMLPanel refPanel;
public ReferenceUI() {
initWidget(uiBinder.createAndBindUi(this));
}
public CreditReferenceUI(final UiBinder<Widget, CreditReferenceUI> binder) {
initWidget(binder.createAndBindUi(this));
}
public HTMLPanel getRefPanel() {
return refPanel;
}
}
ReferenceUI.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:gwittir="urn:import:com.totsp.gwittir.client.ui">
<g:HTMLPanel ui:field="referencePanel">
<table>
<tr>
<td>
<b>First Name</b></td>
<td>
<b>Last Name</b></td>
<td>
<b>Phone</b></td>
<td>
<b>Fax</b></td>
</tr>
<tr>
<td>
<gwittir:TextBox ui:field="referenceFirstName" styleName="input"/></td>
<td>
<gwittir:TextBox ui:field="referenceLastName" styleName="input"/></td>
<td>
<table><tr>
<td> ( </td> <td>
<gwittir:TextBox ui:field="referencePhoneAreaCode" styleName="input" maxLength="3"/></td>
<td> ) </td> <td>
<gwittir:TextBox ui:field="referencePhoneNumber" styleName="input" maxLength="7"/></td>
<td> # </td> <td>
<gwittir:TextBox ui:field="referencePhoneExtension" styleName="input" maxLength="25"/></td>
</tr></table></td>
<td>
<table><tr>
<td> ( </td> <td>
<gwittir:TextBox ui:field="referenceFaxAreaCode" styleName="input" maxLength="3"/></td>
<td> ) </td> <td>
<gwittir:TextBox ui:field="referenceFaxNumber" styleName="input" maxLength="7"/></td>
</tr></table></td>
</tr>
<tr>
<td style="text-align:right">
<b>Address: </b> Street</td>
<td>
<gwittir:TextBox ui:field="referenceStreet" styleName="input"/></td>
<td colspan="2" style="width:50%">
<table><tr><td> City</td>
<td><gwittir:TextBox ui:field="referenceCity" styleName="input" maxLength="25"/></td>
<td> State </td>
<td class="state"><gwittir:TextBox ui:field="referenceState" styleName="input" maxLength="2"/></td>
<td> ZIP</td>
<td><gwittir:TextBox ui:field="referenceZIP" styleName="input" maxLength="9"/></td></tr></table>
</td>
</tr>
</table>
</g:HTMLPanel>
</ui:UiBinder>
AppUIDemo.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:gwittir="urn:import:com.totsp.gwittir.client.ui">
<g:HTMLPanel ui:field="basePanel">
<!-- <div id="MainContent"> -->
<p><h2><b>Application Demo</b></h2></p>
<g:FlowPanel ui:field="referencePanel">
</g:FlowPanel>
</g:HTMLPanel>
</ui:UiBinder>
Bedienfeld "Referenz" in *.ui.xml ist definiert als <g:HTMLPanel ui:field="referencePanel">. Wie würde ich das definieren der id für die composite - können Sie ein Beispiel? Es gibt keine lokalen UiBinder-code, UiBinder ist importiert aus com.google.gwt.uibinder.client.UiBinder.
Kannst du die UiBinder-Vorlage für AppUIDemo sowie ReferenceUI? Es wäre schön zu sehen, genau das, was die Hierarchie der widgets aussieht.
...eigentlich, für diese Angelegenheit, wie sind Sie in der Lage zu nennen
new ReferenceUI(refUIBinder);
? Ist das ein Tippfehler ClientReferenceUI
?es gibt keine ClientReferenceUI in der Hierarchie
InformationsquelleAutor jprusakova | 2010-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnen werde ich mit dem fix, dann bewegen Sie auf, um es zu erklären danach.
Die Lösung
Der einfachste Weg, um dieses problem zu lösen, ist wie folgt. Hier ist dein code:
Ersetze das mit folgendem code. Beachten Sie, dass nur die Letzte Zeile geändert hat.
Diese Weise, Sie sind das hinzufügen der
Composite
Objekt. Wird es für den Nutzer keinen Unterschied, wie dieHTMLPanel
(IhrinnerPanel
) werden direkt an das Dokument.Einige hintergrund
Hinzufügen eines widgets zu einem komplexen panel
Wenn Sie ein widget hinzufügen, um eine komplexe Panels (ein panel mit mehr als einem Kind-widget), vier Dinge passieren, eine nach der anderen:
Sagen, ein widget zu entfernen sich von seinen Eltern
Wenn ein Kind erzählte zu entfernen sich von seinen Eltern, die eine der folgenden Bedingungen Auftritt:
HasWidgets
das widget sagt die Systemsteuerung entfernen, widgetIllegalStateException
mit der Meldung "Dieses widget ist der Elternteil nicht umsetzen HasWidgetsComposite-widgets
Beim Aufruf
initWidget(Widget)
das widget parent gesetztComposite
Objekt.Das problem
Wenn Sie versuchen, hinzufügen
innerPanel
es wird erzählt, entfernen sich von der aktuellen Eltern.innerPanel
ist eigentlich die Wurzel Ihrer UiBinder-Vorlage. Das übergeordnete Element ist einComposite
Objekt (insbesondereReferenceUI
). Dies führt zu der Ausnahme, die geworfen wird, alsComposite
nicht implementiertHasWidgets
und unterstützt nicht entfernen, widget.ich danke Ihnen sehr für eine Antwort und ausführliche Erklärung.
Froh, dass es funktionierte, jprusakova. Und von Ihnen positiv bewertet werden Ihre Antwort Igor - es scheint, dass große Geister gleich denken!
InformationsquelleAutor Wesley
Leider, IIRC kann man das nicht festlegen einer id für ein Widget in UiBinder ' s code (kann man glaub ich nur für normale HTML). So bleibt man mit der richtigen Einstellung der id über
someWidget.getElement().setId()
(wie im code oben).Was jetzt noch fehlt, denke ich, ist ein Platzhalter (ein div -, span -, was auch immer) mit der richtigen id in der
HTMLPanel referencePanel
:Und in
AppUIDemo
:...es sei denn, Sie möchten, fügen Sie die ReferenceUI direkt in
referencePanel
- in diesem Fall sollten Sie nur verwenden eineFlowPanel
🙂PS: IMHO sollten Sie generieren und setzen Sie die eindeutige id für das
ReferenceUI.refPanel
von derReferenceUI
Klasse (und setzen die id) - so dass Sie nicht Durcheinander mit dem widget "internals" von einigen externen widgets.OK, ich glaube ich hab es. Die
IllegalStateException
Ausnahme wird geworfen, weil Sie mit dem hinzufügenReferenceUI.refPanel
(oderReferenceUI.referencePanel
, ich weiß nicht, was ist der aktuelle name)AppUIDemo
(ReferenceUI
offensichtlich nicht umsetzenHasWidgets
) - Wann sollte man hinzufügen, das ganzeReferenceUI reference
composite 🙂 ich weiß nicht, warum Sie es auf diese Weise in der ersten Stelle (vielleicht durch das ganze Durcheinander mit den ids), aber der code sollte wie folgt Aussehen:Es sollte zeigen Sie auf die Zeile, an der die Ausnahme aufgetreten ist - alles? Und beide
HTMLPanel
undFlowPanel
natürlich implementierenHasWidgets
, so würde dies bedeuten, dass das problem mit Ihrem code könnten Sie die post der aktuellen *.ui.xml Dateien?Die Ausnahme Punkte, generiert JavaScript-code, wo ein Weg zu verfolgen es zurück zu Java-Quellcode?
Hinzugefügt ReferenceUI.ui.xml code auf die obige Frage.
vielen Dank für Ihre Hilfe!
InformationsquelleAutor Igor Klimer