首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为我的图表加载数据的GXT-3问题

为我的图表加载数据的GXT-3问题
EN

Stack Overflow用户
提问于 2013-03-15 22:24:00
回答 1查看 637关注 0票数 0

我的问题很烦人。我的服务器端生成了12个随机数(这里是双倍)。

我的客户端收到了正确的数据,但My Chart中没有显示任何内容。这可以很好地处理存储中的硬编码数据,但不能用于REST调用。

我的服务器和客户端之间的传输是这样的:

代码语言:javascript
复制
[{"key":"key0","value":0.47222548599297787},{"key":"key1","value":0.6009173797369691},{"key":"key2","value":0.13880104282435624},{"key":"key3","value":0.01804674319345545},{"key":"key4","value":0.5547733564202956},{"key":"key5","value":0.8229999661308851},{"key":"key6","value":0.8959346004391032},{"key":"key7","value":0.6848052288628435},{"key":"key8","value":0.10222856671111813},{"key":"key9","value":0.6931371931409103},{"key":"key10","value":0.2994297934549003},{"key":"key11","value":0.47566752196381334}]

这里我的简单类用于我的测试。我是GXT 3的新手

代码语言:javascript
复制
public void onModuleLoad() {

    final ListStore<JSOModel> store;
    final ContentPanel panel  = new FramedPanel();
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "/ws/DocumentService/v1/test");
    builder.setHeader("Accept", "application/json");

    HttpProxy proxy = new HttpProxy(builder);

    final Loader<ListLoadConfig, ListLoadResult<JSOModel>> loader = new ListLoader<ListLoadConfig, ListLoadResult<JSOModel>>(proxy, new DataReader<ListLoadResult<JSOModel>, String>() {
        @Override
        public ListLoadResult<JSOModel> read(Object loadConfig, String data) {
            List<JSOModel> jsoModels = new ArrayList<JSOModel>();
            JsArray<JSOModel> jsoModelJsArray = JSOModel.arrayFromJson(data);
            if(jsoModelJsArray != null) {
                for(int i = 0; i < jsoModelJsArray.length(); i++) {
                    jsoModels.add(jsoModelJsArray.get(i));
                }
            }

            return new ListLoadResultBean<JSOModel>(jsoModels);
        }
    });

    store = new ListStore<JSOModel>(new ModelKeyProvider<JSOModel>() {
        @Override
        public String getKey(JSOModel item) {
            return item.get("key");
        }
    });

    loader.addLoadHandler(new LoadResultListStoreBinding<ListLoadConfig, JSOModel, ListLoadResult<JSOModel>>(store) {
        @Override
        public void onLoad(LoadEvent<ListLoadConfig, ListLoadResult<JSOModel>> event) {
            ListLoadResult<JSOModel> loaded = event.getLoadResult();
            if(loaded.getData() == null) {
                store.replaceAll(new ArrayList<JSOModel>());
            } else {
                store.replaceAll(loaded.getData());
            }
        }
    });

    Chart<JSOModel> chart = new Chart<JSOModel>();
    chart.setStore(store);
    chart.setShadowChart(true);

    NumericAxis<JSOModel> axis = new NumericAxis<JSOModel>();
    axis.setPosition(Chart.Position.LEFT);
    axis.addField(new ValueProvider<JSOModel, Number>() {
        @Override
        public Number getValue(JSOModel JSOModel) {
            return JSOModel.getNumber("value");
        }

        @Override
        public void setValue(JSOModel JSOModel, Number number) {

        }

        @Override
        public String getPath() {
            return "key";
        }
    });
    axis.setTitleConfig(new TextSprite("Number of hits"));
    axis.setWidth(50);
    axis.setMinimum(0);
    axis.setMaximum(100);
    chart.addAxis(axis);

    PathSprite odd = new PathSprite();
    odd.setOpacity(1);
    odd.setFill(new Color("#dff"));
    odd.setStroke(new Color("#aaa"));
    odd.setStrokeWidth(0.5);
    axis.setGridOddConfig(odd);

    CategoryAxis<JSOModel, String> horizontalAxis = new CategoryAxis<JSOModel, String>();
    horizontalAxis.setPosition(Chart.Position.BOTTOM);
    horizontalAxis.setField(new ValueProvider<JSOModel, String>() {
        @Override
        public String getValue(JSOModel JSOModel) {
            return  JSOModel.get("key");
        }

        @Override
        public void setValue(JSOModel JSOModel, String s) {

        }

        @Override
        public String getPath() {
            return "key";
        }
    });
    horizontalAxis.setTitleConfig(new TextSprite("month of year"));
    chart.addAxis(horizontalAxis);

    LineSeries<JSOModel> column = new LineSeries<JSOModel>();
    column.setYAxisPosition(Chart.Position.LEFT);
    column.setStroke(new RGB(148,174,10));
    column.setHighlighting(true);
    chart.addSeries(column);

    axis.addField(column.getYField());
    chart.addSeries(column);

    chart.setHeight(100);
    chart.setWidth(100);

    Button b = new Button("ha");
    b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent clickEvent) {
            loader.load();
        }
    });

    RootPanel.get().add(b);



    panel.setCollapsible(true);
    panel.setHeadingText("Column Chart");
    panel.setPixelSize(620, 500);
    panel.setBodyBorder(true);


    VerticalLayoutContainer layout = new VerticalLayoutContainer();
    panel.add(layout);

    chart.setLayoutData(new VerticalLayoutContainer.VerticalLayoutData(1,1));
    layout.add(chart);

    chart.setBackground(new Color("#dff"));
    RootPanel.get().add(panel);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-15 22:48:40

有两种方法可以将图表连接到存储中。一种是简单地指定图表正在通过setStore使用存储,就像您已经做的那样:

代码语言:javascript
复制
    chart.setStore(store);

执行此操作时,还必须通知图表何时必须重新绘制所有内容-您必须调用:

代码语言:javascript
复制
    chart.redrawChart();

此调用必须在加载完成后不久进行-考虑在onLoad结束时执行。

为什么这是必需的?在某些情况下,开发人员希望对存储进行许多更改,一次一个,如果图表在每次更改后自动更新,这将导致对数据模型进行许多缓慢的更改,并可能最终看起来很奇怪。在这种情况下,您只需在完成所有更改后调用redrawChart()

但是,还有另一种选择-您可以调用bindStore,并在图表发生任何更改时要求图表自动更新,而不是调用setStore

代码语言:javascript
复制
    chart.bindStore(store);

在您的情况下,这可能是正确的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15434836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档