Question

I'm trying to write a simple application to display chart data. I want to display some data as soon as the user loads the page, so I'm getting data & drawing tables inside of the Runnable as described in the gwt-visualization Getting Started.

Things seem to work alright, except charts tend to get loaded more than once. Below is my onModuleLoad().

    private final StatisticsServiceAsync statisticsService = GWT.create(StatisticsService.class);
    GWTBeanFactory factory = GWT.create(GWTBeanFactory.class);
    DataTable locationData;
    AnnotatedTimeLine atl;
    GeoMap usMap;
    TextBox storeField;
    Button log10Button;
    DateRange durationChartRange;
    String eusrJson = null;
    Button b;
    HTML last1000Html;

    public void onModuleLoad() {

    storeField = new TextBox();
    storeField.setText("Enter a store");
    storeField.addKeyDownHandler(new MyKeyHandler());
    b = new Button("Get Stats!");
    log10Button = new Button("Show Log10 Scale");
    log10Button.addClickHandler(new Log10ClickHandler());
    b.addClickHandler(new MyClickHandler());

    last1000Html = new HTML();
    getLast1000Avg();

    Runnable onLoadCallback = new Runnable() {
        public void run() {
            storeDurationData = DataTable.create();
            storeDurationDataLog10 = DataTable.create();

            RootPanel.get("storeDurationDiv").add(storeField);
            RootPanel.get("storeDurationDiv").add(b);
            RootPanel.get("storeDurationDiv").add(log10Button);
            RootPanel.get("storeDurationDiv").add(last1000Html);

            log10Button.setVisible(false);

            // Get initial Data
            getAvgByRegion();
            getLast1000Avg();
            Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
                @Override
                public boolean execute() {
                    getLast1000Avg();
                    return true;
                }
            }, 5000);

        }
    };

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

All of the "simple" elements seem to get populated correctly, as the Button, HTML, and TextBox all get placed appropriately (which used to be inside of run, they're where they are now as a result of debugging previous errors). However, the GeoMap gets placed twice, and looking at the logging you can tell that the Runnable's run is being executed at least twice, which seems reasonable, but I don't know how to keep it from adding twice.

I'm probably screwing up something with the Async stuff, but I'm new and confused. Below is my getAvgByRegion() method:

    private void getAvgByRegion() {
    statisticsService.getEusrForRegion(new AsyncCallback<String>() {

        @Override
        public void onFailure(Throwable caught) {
            System.out.println(":(");
        }

        @Override
        public void onSuccess(String result) {
            createLocTable();
            DataTable dt = parseEusrLocations(result);
            usMap = new GeoMap(dt, createGeoMapOptions());
            usMap.setSize("800px", "600px");
            RootPanel.get("storeDurationDiv").add(usMap);
        }

    });
}

Any advice on how best to work with GWT is welcome.

Was it helpful?

Solution

So, you call VisualizationUtils.loadVisualizationApi twice, so the onLoadCallback will be run twice (I don't know GWT Google Apis, this is a supposition).

onLoadCallback calls getAvgByRegion, so that one will get called twice too; and it gets data and in the callback creates a new GeoMap and adds it to the RootPanel.get("storeDurationDiv"), so you get two GeoMaps on the screen.

The other widgets(storeField, etc.) are created only once, so adding them repeatedly is not a problem (except performance-wise), as they'll first be removed from their current parent before being added to the new one (which in this case is the same)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top