2010-04-22 13 views
6

Necesito establecer el tamaño de un panel absoluto con respecto a su tamaño hijo, pero los métodos getOffset * devuelven 0 porque (creo) el hijo aún no se ha mostrado.GWT - Recuperar el tamaño de un widget que no se muestra

un ejemplo rápido:

AbsolutePanel aPanel = new AbsolutePanel(); 
HTML text = new HTML(/*variable lenght text*/); 
int xPosition = 20; // actually variable 
aPanel.add(text, xPosition, 0); 
aPanel.setSize(xPosition + text .getOffsetWidth() + "px", "50px"); // 20px 50px 

también pude resolver mi problema utilizando el tamaño AbsolutePanel para fijar la posición del niño y tamaño:

AbsolutePanel aPanel = new AbsolutePanel(); 
aPanel.setSize("100%", "50px"); 
HTML text = new HTML(/*variable lenght text*/); 
int xPosition = aPanel.getOffsetWidth()/3; // Once again, getOffsetWidth() returns 0; 
aPanel.add(text, xPosition, 0); 

En ambos casos, tengo que encontrar una manera de cualquiera:

  • recuperar el tamaño de un widget que no se ha mostrado
  • se notificará cuando se muestre un widget

Respuesta

2

Creo que debería intentar resolver esto con estilos CSS. Si yo fuera usted, trataría de establecer un estilo para el panel principal y/o absoluto, usando addStyle o addStyleNames. Tal vez algo así como ...

AbsolutePanel aPanel = new AbsolutePanel(); 
aPanel.setSize("100%", "50px"); 
HTML text = new HTML(/*variable lenght text*/); 
text.addStyleName("my-custom-style"); 

en CSS, crearía un estilo CSS que luego dimensionaría su widget de forma adecuada.

El otro enfoque sería ....

Se puede crear una función que crea un widget HTML exactamente el tamaño que necesita.

Aquí hay algo de código para usted, para que pueda empezar:

public native void customizeHTMLElement(Element elem, String widthInPx) /*-{ 
    elem.style.width = widthInPx; //this is basically pure js. 
}-*/ 

Then somewhere within your widget make a call to the above function like 

public void foo() { 
    ... 
    customizeHTMLElement(someElement, "20"); 
    ... 
} 

Algunos información sobre JSNI - http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html

+0

Actualmente hay varios widgets en mi AbsolutePanel con tamaños y posiciones específicos. Como el tamaño y las posiciones no son fijas (depende de los datos) no puedo usar un css ... – Garagos

+0

¿Podría describir qué tipo de widgets se usan? Básicamente, proporcione algunos detalles sobre el problema al que se enfrenta. Podría aparecer. con alguna otra solución. Lo que estoy pensando en este momento son los métodos js nativos, que estoy muy seguro de que funcionarían, pero creo que sería mejor si de alguna manera lograras usar el estilo css. – markovuksanovic

+0

Necesito crear un widget que represente eventos en el tiempo. Así que estoy usando un widget HTML para representar cada ocurrencia de esos eventos (también podría ser un HorizontalPanel que contiene un widget descriptor) con position = startDate y width = Duración del evento. Como el método AbsolutePanel.add() solo toma int para la posición de píxel, no puedo trabajar con el porcentaje. Por lo tanto, necesito un tamaño de referencia en píxeles, ya sea desde AbsolutePanel o una de las ocurrencias. – Garagos

4

Widget tiene un método onLoad() puede anular que se activa cuando el widget se adjunta a el DOM, en cuyo punto getOffsetWidth() devolverá el tamaño del texto representado, a menos que el widget en el que se encuentra su cadena ya tenga algún tamaño aplicado. Si puede hacer lo que necesita con CSS (incluyendo quizás simplemente configurar "overflow: visible;") eso probablemente sea mejor, pero a veces realmente necesita el tamaño, y esta técnica se lo dará a usted.

1

Debe llamar a getOffsetHeight() solo después de que se coloque y calcule el widget. Entonces GWT tiene

com.google.gwt.core.client.Scheduler 

clase para hacer esto.

En mi proyecto utilizo LayoutPanel para mostrar el menú en la parte superior y otro contenido en el centro. Pero no sé el tamaño del menú. Así que proporciono información a LayoutPanel calculada usando getOffsetHeight de esta manera:

layoutPanel.add(widget); 
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() 
{ 
    public void execute() 
    { 
     int offsetHeight = widget.getOffsetHeight(); 
     layoutPanel.setWidgetTopHeight(widget, 0, Style.Unit.PX, offsetHeight, Style.Unit.PX); 
    } 
}); 
Cuestiones relacionadas