добавить данные DataTable не работает? - PullRequest
1 голос
/ 03 декабря 2011

Я пытаюсь заставить метод data.SetValue(...) работать в асинхронном обратном вызове в методе getNames.К сожалению, это не работает.data.setValue(...) работает ли в синхронном методе createColumnChartView.

В чем может быть причина этой проблемы?Пожалуйста, объясните, почему настройки данных не работают в getNames.Заранее спасибо!

import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget; 
import com.google.gwt.visualization.client.DataTable;
import com.google.gwt.visualization.client.AbstractDataTable.ColumnType;
import com.google.gwt.visualization.client.visualizations.corechart.ColumnChart;
import com.google.gwt.visualization.client.visualizations.corechart.CoreChart;
import com.google.gwt.visualization.client.visualizations.corechart.Options;
import com.practicum.client.Product;
import com.practicum.client.rpc.ProductService;
import com.practicum.client.rpc.ProductServiceAsync;


public class DataOutColumnChart {
private final DataTable data = DataTable.create();
private final Options options = CoreChart.createOptions();
private final ProductServiceAsync productService = GWT.create(ProductService.class);

public DataOutColumnChart(Runnable runnable) {
}

public Widget createColumnChartView() {
    /* create a datatable */
    data.addColumn(ColumnType.STRING, "Price");
    data.addColumn(ColumnType.NUMBER, "EUR");
    data.addRows(2);
    data.setValue(0, 0, "Bar 1");
    data.setValue(0, 1, 123);
    getNames();

    /* create column chart */
    options.setWidth(400);
    options.setHeight(300);
    options.setBackgroundColor("#e8e8e9");

    return new ColumnChart(data, options);
}

public void getNames() {
    productService.getNames(new AsyncCallback<ArrayList<Product>>() {
        public void onFailure(Throwable caught) {
        }

        public void onSuccess(ArrayList<Product> result) {
            for (Product p : result) {
                data.setValue(0, 0, "Bar 2"); // DONT WORK, NOTHING HAPPENS
                data.setValue(0, 1, 345); // DONT WORK, NOTHING HAPPENS
                System.out.println("Bla bla test"); // THIS WORKS
            }
        }
    });
}
}

1 Ответ

0 голосов
/ 03 декабря 2011

Проблема возникает из-за того, что вы устанавливаете данные для DataTable, для которого уже обработано .Ваш асинхронный вызов в getNames() завершается слишком медленно, чтобы повлиять на DataTable во время рендеринга ColumnChart.Даже если бы сделал достаточно быстро, это всегда было бы условием гонки.В идеале вы не должны отображать эту диаграмму до тех пор, пока после вы не получите все необходимые данные из вызова RPC.

Другой вариант - сохранить ссылку на этот ColumnChart и вызвать columnChart.draw(...) после того, как вы вернете свои данные из RPC.

Редактировать:

Вот пример, который вы запросили.

import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget; 
import com.google.gwt.visualization.client.DataTable;
import com.google.gwt.visualization.client.AbstractDataTable.ColumnType;
import com.google.gwt.visualization.client.visualizations.corechart.ColumnChart;
import com.google.gwt.visualization.client.visualizations.corechart.CoreChart;
import com.google.gwt.visualization.client.visualizations.corechart.Options;
import com.practicum.client.Product;
import com.practicum.client.rpc.ProductService;
import com.practicum.client.rpc.ProductServiceAsync;


public class DataOutColumnChart {
    private final DataTable data = DataTable.create();
    private final Options options = CoreChart.createOptions();
    private final ProductServiceAsync productService = GWT.create(ProductService.class);
    private ColumnChart chart = null;

    public DataOutColumnChart(Runnable runnable) {
    }

    public void initColumnChart() {
        /* create a datatable */
        data.addColumn(ColumnType.STRING, "Price");
        data.addColumn(ColumnType.NUMBER, "EUR");

        /* create column chart */
        options.setWidth(400);
        options.setHeight(300);
        options.setBackgroundColor("#e8e8e9");

        chart = new ColumnChart(data, options);
    }

    public void getNames() {
        productService.getNames(new AsyncCallback<ArrayList<Product>>() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess(ArrayList<Product> result) {
                if (result != null && result.size() > 0) {
                    // if there is data...
                    data.addRows(result.size()); // add a row for each result
                    for (int i = 0; i < result.size(); i++) {
                        // loop through the results
                        Product product = result.get(i); // get out the product
                        // ...then set the column values for this row
                        data.setValue(i, 0, product.getSomeProperty());
                        data.setValue(i, 1, product.getSomeOtherProperty());
                    }
                    updateChart();
                }
            }
        });
    }

    public void updateChart() {
        chart.draw(data, options);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...