Java 添加数据表数据不工作?

Java 添加数据表数据不工作?,java,gwt,Java,Gwt,我正在尝试让方法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.As

我正在尝试让方法
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
            }
        }
    });
}
}
import java.util.ArrayList;
导入com.google.gwt.core.client.gwt;
导入com.google.gwt.user.client.rpc.AsyncCallback;
导入com.google.gwt.user.client.ui.Widget;
导入com.google.gwt.visualization.client.DataTable;
导入com.google.gwt.visualization.client.AbstractDataTable.ColumnType;
导入com.google.gwt.visualization.client.visualizations.corechart.ColumnChart;
导入com.google.gwt.visualization.client.visualizations.corechart.corechart;
导入com.google.gwt.visualization.client.visualizations.corechart.Options;
导入com.practicum.client.Product;
导入com.practicum.client.rpc.ProductService;
导入com.practicum.client.rpc.ProductServiceAsync;
公共类DataOutColumnChart{
private final DataTable data=DataTable.create();
private final Options=CoreChart.createOptions();
私有最终产品服务异步产品服务=GWT.create(productService.class);
公共DataOutColumnChart(可运行可运行){
}
公共小部件createColumnChartView(){
/*创建数据表*/
data.addColumn(ColumnType.STRING,“Price”);
data.addColumn(ColumnType.NUMBER,“EUR”);
数据。添加行(2);
数据。设定值(0,0,“条1”);
数据设置值(0,1,123);
getNames();
/*创建柱形图*/
选项。设置宽度(400);
选项:设置高度(300);
选项。setBackgroundColor(“#e8e8e9”);
返回新的柱形图(数据、选项);
}
public void getNames(){
getNames(新的AsyncCallback(){
失败时的公共无效(可丢弃){
}
成功时公共无效(ArrayList结果){
对于(产品p:结果){
data.setValue(0,0,“Bar 2”);//不工作,什么也没发生
data.setValue(0,1345);//不工作,什么也没发生
System.out.println(“Bla-Bla-test”);//这很有效
}
}
});
}
}

出现问题的原因是您正在将数据设置为已呈现的
数据表。异步调用
getNames()
完成得太慢,无法及时影响
DataTable
以呈现
柱形图。即使它完成得足够快,它也永远是一个比赛状态。理想情况下,在从RPC调用接收到所有必要的数据之前,您不会实际呈现该图表

另一个选项是存储对该
ColumnChart
的引用,并在从RPC获取数据后调用
ColumnChart.draw(…)

编辑:

以下是您要求的示例

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);
    }
}
import java.util.ArrayList;
导入com.google.gwt.core.client.gwt;
导入com.google.gwt.user.client.rpc.AsyncCallback;
导入com.google.gwt.user.client.ui.Widget;
导入com.google.gwt.visualization.client.DataTable;
导入com.google.gwt.visualization.client.AbstractDataTable.ColumnType;
导入com.google.gwt.visualization.client.visualizations.corechart.ColumnChart;
导入com.google.gwt.visualization.client.visualizations.corechart.corechart;
导入com.google.gwt.visualization.client.visualizations.corechart.Options;
导入com.practicum.client.Product;
导入com.practicum.client.rpc.ProductService;
导入com.practicum.client.rpc.ProductServiceAsync;
公共类DataOutColumnChart{
private final DataTable data=DataTable.create();
private final Options=CoreChart.createOptions();
私有最终产品服务异步产品服务=GWT.create(productService.class);
私有柱形图=空;
公共DataOutColumnChart(可运行可运行){
}
公共列图(){
/*创建数据表*/
data.addColumn(ColumnType.STRING,“Price”);
data.addColumn(ColumnType.NUMBER,“EUR”);
/*创建柱形图*/
选项。设置宽度(400);
选项:设置高度(300);
选项。setBackgroundColor(“#e8e8e9”);
图表=新的柱形图(数据、选项);
}
public void getNames(){
getNames(新的AsyncCallback(){
失败时的公共无效(可丢弃){
}
成功时公共无效(ArrayList结果){
if(result!=null&&result.size()>0){
//如果有数据。。。
data.addRows(result.size());//为每个结果添加一行
对于(int i=0;i
您好,谢谢您的回复,我不擅长Java编程。。。你能根据我的代码给我举个例子吗?谢谢@卡尔文,好了。我没有测试它,但它应该可以正常工作。