2010-04-29 7 views
4

Je travaille sur l'apprentissage de GWT (total newb) et j'ai une question concernant l'API Visualiztion fournie par Google. Cette page: http://code.google.com/p/gwt-google-apis/wiki/VisualizationGettingStartedUtilisation de Google Visualization dans GWT 2.0

Décrit comment démarrer avec un camembert (ce dont j'ai besoin). Cependant, j'essaie de le faire dans une interface utilisateur composite en utilisant UiBinder. À cette fin, je ne sais pas comment gérer le rappel correctement qui est montré:

public class SimpleViz implements EntryPoint { 
    public void onModuleLoad() { 
    // Create a callback to be called when the visualization API 
    // has been loaded. 
    Runnable onLoadCallback = new Runnable() { 
     public void run() { 
     Panel panel = RootPanel.get(); 

     // Create a pie chart visualization. 
     PieChart pie = new PieChart(createTable(), createOptions()); 

     pie.addSelectHandler(createSelectHandler(pie)); 
     panel.add(pie); 
     } 
    }; 

    // Load the visualization api, passing the onLoadCallback to be called 
    // when loading is done. 
    VisualizationUtils.loadVisualizationApi(onLoadCallback, PieChart.PACKAGE); 
    } 

Ma première hypothèse est cela va dans le constructeur UiBinder, correct? Pourtant, cela suppose que je veux placer l'élément dans le RootLayoutPanel, et je ne le fais pas. Je ne peux pas voir une manière élégante et évidente de le placer dans le classeur. Je soumets que même cette supposition peut être fausse. Des idées des experts?

EDIT: Je tiens à préciser ma tentative:

public GraphPanel() { 
     initWidget(uiBinder.createAndBindUi(this)); 

     Runnable onLoadCallback = new Runnable() { 
      public void run() { 
       //LayoutPanel panel = RootPanel. 

       // Create a pie chart visualization. 
       PieChart pie = new PieChart(createPieTable(), createPieOptions()); 
       pie.addSelectHandler(createSelectHandler(pie)); 
       mySelf.getElement().appendChild(pie.getElement()); // .add(pie); 
      } 
      }; 

      // Load the visualization api, passing the onLoadCallback to be called 
      // when loading is done. 
      VisualizationUtils.loadVisualizationApi(onLoadCallback, PieChart.PACKAGE); 
    } 

Quand cours, je reçois le texte suivant dans le Composites DIV:

<div class="gwt-viz-container"></div> 

Mais je ne vois pas le graphique en utilisant le code de ce qui précède page.

EDIT 2: Ce lien peut fournir des informations supplémentaires. Cependant, la solution proposée n'est pas optimale car l'application doit alors en savoir plus sur le widget (et si le widget est encore là). http://vaadin.com/forum/-/message_boards/message/97850

EDIT 3: Cela ne devrait pas importer, mais juste au cas où, je cours FF sous Linux. Certains articles que j'ai lus impliquent que c'est un problème.

EDIT 4: Ajout:

pie.draw(createPieTable(), createPieOptions()); 

après que l'enfant append obtient le graphique pour afficher. Cela implique que l'ordre de l'exemple est faux. Si oui, quel est l'optimum?

Répondre

3

Il est également important de savoir que même si la bibliothèque GWT JRE Emulation prend en charge la Runnable interface, il ne peut pas vraiment être utilisé pour le traitement parallèle dans un thread séparé, car le code est compilé en JavaScript qui à son tour s'exécute à un seul thread dans le navigateur. Idem pour le mot-clé synchronized.

Je recommande également de faire toute la logique de préparation dans le constructeur Widget/Composite, mais tout dessin réel dans le rappel onLoad, que vous devez remplacer. Ce rappel est appelé lorsque le widget est chargé dans le document du navigateur. C'est alors seulement que vous pouvez effectuer n'importe quelle interaction de page/disposition, comme activer/désactiver les contrôles ou demander la mise au point.

+1

Vous votant tous les deux mais donnant le chèque ici car je pense que c'était la clé de mon problème. Merci pour votre aide à tous les deux. – nick

3

De toute façon vous suggérerait travailler. Si l'API de visualisation est utilisée par un ensemble de widgets différents sur la page, il peut être plus simple de placer l'appel loadVisualizationApi dans la classe EntryPoint - un exemple de ceci est ci-dessous.

Vous pouvez écrire le Composite comme ceci:

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

    @UiField Panel panel; 

    public MyPieChartContainer() { 
    initWidget(uiBinder.createAndBindUi(this)); 

    PieChart pie = new PieChart(createTable(), createOptions()); 
    pie.addSelectHandler(createSelectHandler(pie)); 
    panel.add(pie); 
    } 
} 

Et puis faire dans le EntryPoint:

public class SimpleViz implements EntryPoint { 
    public void onModuleLoad() { 
    // Create a callback to be called when the visualization API 
    // has been loaded. 
    Runnable onLoadCallback = new Runnable() { 
     public void run() { 
     Panel panel = RootPanel.get(); 
     MyPieChartContainer myPieChartContainer = new MyPieChartContainer();  
     panel.add(myPieChartContainer); 
     } 
    }; 

    // Load the visualization api, passing the onLoadCallback to be called 
    // when loading is done. 
    VisualizationUtils.loadVisualizationApi(onLoadCallback, PieChart.PACKAGE); 
    } 
+0

Cela n'impliquerait-il pas un seul graphique si je le fais dans EntryPoint? – nick

+0

Je ne vois pas pourquoi faire l'initialisation dans EntryPoint implique un seul graphique - imaginez cette implémentation de la méthode run: public void run() { Panel panel = RootPanel.get(); MyPieChartContainer myPieChartContainer1 = nouveau MyPieChartContainer(); panel.add (myPieChartContainer1); MyPieChartContainer myPieChartContainer2 = new MyPieChartContainer(); panel.add (myPieChartContainer2); } – aem

Questions connexes