Articles avec #gwt tag

Publié le 8 Février 2013

Dans GWT pour créer de nouveaux widgets il est d'usage d'étendre la classe Composite. Je n'ai pas rencontré de problème pour créer les widgets par contre pour générer des évènements lors d'un changement de valeur dans le widget ça n'a pas été aussi simple.

J'ai opté pour une solution utilisant les ValueChangeEvent. L'implémentation est assez simple mais c'est surtout le manque de documentation qui pêche.

Voilà comment faire un composite qui génère des ValueChangeEvent:

 

public class DateTimePicker extends Composite implements HasValueChangeHandlers<Date>{

   private final HorizontalPanel content = new HorizontalPanel();
   private final DateBox dateBox = new DateBox();
   private final ListBox timeListBox = new ListBox();

   public DateTimePicker(){
      dateBox.setFormat(new DefaultFormat(DateTimeFormat.getFormat("yyyy-MM-dd")));
      content.add(dateBox);
      content.add(timeListBox);
      initWidget(content);
      registerHandlers();
      fillInTimeListBox();
   }

   private void registerHandlers(){
      // On enregistre des handler pour être notifié des changements dans nos composants
      dateBox.addValueChangeHandler(new ValueChangeHandler<Date>() {
         @Override
         public void onValueChange(ValueChangeEvent<Date> arg0) {
            DateTimePicker.this.onValueChange();
         }
      });
      timeListBox.addChangeHandler(new ChangeHandler() {
         @Override
         public void onChange(ChangeEvent arg0) {
            DateTimePicker.this.onValueChange();
         }
      });
   }

   private void fillInTimeListBox(){
      NumberFormat format = NumberFormat.getFormat("00");
      for(int i = 0; i < 24; i++){
         timeListBox.addItem(format.format(i)+":00"); 
      }
   }

   public Date getValue(){
      String date = dateBox.getTextBox().getText();
      if(date != null && !date.isEmpty()){
         String time = timeListBox.getValue(timeListBox.getSelectedIndex());
         Date value = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm").parse(date+" "+time);
         return value;
      }
      return null;
   }

   @Override
   public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Date> handler) {
      // permet à d'autres objets de s'enregistrer pour recevoir des ValueChangeEvents
      return addHandler(handler, ValueChangeEvent.getType());
   }

   private void onValueChange(){
      // lance l'évènement, appelé lors des changements dans la dateBox ou la ListBox
      ValueChangeEvent.fire(this, getValue());
   }
}   

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 6 Février 2012

Aujourd'hui j'ai décidé d'utiliser GWT designer (juste pour tester la dernière version) mais impossible d'afficher l'onglet design.

Eclipse m'affiche une sombre erreur sur xulrunner:

eclipse-error-xulrunner.png

En cherchant un peu dans les logs d'eclipse je trouve:

GWT http-server started at 127.0.0.1:50737
'GDK_NATIVE_WINDOWS' set, won't use WebKit.

Hop, hop, hop! Un petit coup d'oeil dans /usr/bin/eclipse et bingo! ligne 6:

export GDK_NATIVE_WINDOWS=true

Je rajoute un petit # au début de la ligne pour la commenter, je relance eclipse et le tour est joué!!

Par contre je ne sais pas trop à quoi correspond cette variable 'GDK_NATIVE_WINDOWS' ... si quelqu'un a une explication, je suis preneur.

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 30 Septembre 2011

Juste un lien vers un tutoriel particulièrement intéressant sur le design d'application GWT en utilisant le pattern MVP (Model, View, Presenter).

Le tutoriel est très bien fait en commençant par une application simple, en abordant les stratégies d'optimisation des tests puis viennent des notions plus complexes (dans la 2e partie notamment) fortes utiles dans une application "real life".

http://code.google.com/webtoolkit/articles/mvp-architecture.html

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 5 Septembre 2011

Après avoir récemment migrer vers GWT 2.3 je me suis aperçu que les actions déclenchées par des pressions de la touche Entrée ne fonctionnait plus sous Firefox.

Voici le code que j'utilisait:

 

myTextField.addKeyPressHandler(new KeyPressHandler(){
    @Override
    public void onKeyPress(KeyPressEvent event)    {
        if (KeyCodes.KEY_ENTER == event.getCharCode())        {
            // do something
        }
    }
});

 

Le problème est que sous Firefox event.getCharCode() retourne 0 au lieu de 13.

La solution consiste a passer par un NativeEvent comme ceci:

if(KeyCodes.KEY_ENTER == event.getNativeEvent().getCharCode())

et là tout remarche comme avant!

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 31 Août 2011

Voilà une astuce valable uniquement en mode dev puisqu'elle permet au compilateur GWT de ne pas effectuer les optimisations JavaScript spécifiques à chaque navigateur.

Il faut lancer la compilation avec l'option -draftCompile

Si vous utiliser le maven avec le plugin GWT cela se fait à l'aide de la propriété:

gwt.draftCompile = true

On peut simplement définir cette propriété sur la ligne de commande mvn avec l'option -Dgwt.draftCompile=true

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 22 Juin 2011

J'utilise la propriété user.agent dans mon fichier .gwt.xml pour ne compiler que la permutation pour Firefox (qui au passage s'appelle gecko1_8).

 

Aujourd'hui je voulais ajouter une permutation Chrome pour tester mon application sur ce navigateur.

Et bien le user.agent pour Chrome ne s'appelle pas Chrome (mais Safari). Pourquoi ?

 

Parce que Chrome utilise le moteur de rendu Webkit qui est aussi celui utilisé dans Safari.

 

Voilà l'explication. Au passage en remplaçant la permutation gecko1_8 par safari je gagne presque 40% de temps à la compilation. Cool !

 

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 6 Juin 2011

Je dois calculer et afficher des valeurs dans une application GWT. Le soucis concerne le formattage des nombres car une fois le calcul effectué, l'affichage des valeurs n'est pas très "user friendly": genre 1.347002890098%.

 

J'aurais préférer un simple 1.35% par exemple.

 

Et bien heureusement on peut obtenir facilement ce résultat sans se prendre la tête avec les arrondis et autres, en utilisant simplement la class NumberFormat qui est justement faite pour ça.

 

Dans la pratique ça donne:

 

double value = 12.3456789;
NumberFormat format = NumberFormat.getFormat("0.00");
Window.alert(format.format(value)+"%"); // affiche 12.35%

 

On peut également préciser le signe % dans le format mais ceci a pour effet de multiplier la valeur par 100:

 

double value = 0.123456789;
Number format format = NumberFormat.getFormat("0.00%");
Window.alert(format.format(value)); // affiche 12.35%

 

On n'est pas toujours obligé de spécifier un format. On peut utiliser les formats prédéfinis qui tiennent compte des locales.

Attention donc pour l'affichage monétaire si l'utilisateur utilise une locale différente.

 

double value = 12345.6789;
Number format format = NumberFormat.getDecimalFormat();
Window.alert(format.format(value)); // affiche 12 345.6789

 

double value = 12345.6789;
Number format format = NumberFormat.getCurrencyFormat();
Window.alert(format.format(value)); // affiche 12 345.68€

etc ...

 

Le javadoc de la classe NumberFormat est disponible ici: http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/i18n/client/NumberFormat.html

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0

Publié le 3 Mai 2011

La compilation d'un projet GWT peut rapidement demander un temps de compilation assez conséquent. Ceci d'autant plus que le nombre de permutations à générer est élevé.

 

Pour résumer une permutation correspond à une version du code pour une version d'un navigateur. Par exemple ie8 pour Internet Explorer 8, ou gecko1_8 pour Firefox 3.

 

On comprend facilement que plus le nombre de permutations est élevé plus le temps de compilation sera long. Ce qui est d'autant plus génant qu'on n'a pas toujours besoin de toutes les permutations. Surtout en mode "développement" où on ne teste l'application que sur un navigateur la plupart du temps.

 

Pour faire face à cette problèmatique on peut réduire le nombre de permutation en définissant la propriété user.agent dans le fichier <module>.gwt.xml.

 

<?xml version="1.0" encoding="UTF-8" ?>
<module rename-to="maDemo">
  <inherits name="com.over-blog.patatos.gwt.MaDemo" />
  <set-property name="user.agent" value="gecko1_8" />
</module>

Voir les commentaires

Rédigé par Bliz

Publié dans #GWT

Repost 0