4

GWT (total newb) の学習に取り組んでおり、Google が提供する Visualiztion API について質問があります。このページ: http://code.google.com/p/gwt-google-apis/wiki/VisualizationGettingStarted

円グラフの使用を開始する方法について説明します (これは私が必要としているものです)。ただし、UiBinder を使用して複合 UI でこれを実行しようとしています。そのために、表示されているコールバックを正しく処理する方法がわかりません。

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);
  }

私の最初の仮定は、これが UiBinder コンストラクターに入るということですよね? しかし、これは要素を RootLayoutPanel に配置したいことを前提としていますが、そうではありません。バインダーにそれを配置するエレガントで明白な方法がわかりません。この推測でさえ間違っている可能性があることを申し添えます。専門家からのアイデアはありますか?

編集:私は自分の試みを明確にする必要があります:

    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);
    }

実行すると、Composites DIV に次のように表示されます。

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

しかし、上記のページのコードを使用したグラフは表示されません。

編集 2: このリンクは追加情報を提供する場合があります。ただし、提案されたソリューションは最適ではありません。これは、アプリがウィジェットについて詳しく知る必要があるためです (ウィジェットがそこにあるかどうかも)。 http://vaadin.com/forum/-/message_boards/message/97850

編集 3: 問題ではありませんが、念のため、Linux で FF を実行しています。私が読んだ記事の中には、これが問題であることをほのめかしているものがあります。

編集 4: 追加:

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

追加の子が表示するグラフを取得した後。これは、例の順序が間違っていることを意味します。もしそうなら、最適なものは何ですか?

4

2 に答える 2

3

Runnableまた、GWT JREエミュレーションライブラリはインターフェイスをサポートしていますが、コードがJavaScriptにコンパイルされ、ブラウザでシングルスレッドで実行されるため、別のスレッドでの並列処理には実際には使用できないことを知っておくことも重要です。synchronizedキーワードについても同様です。

また、ウィジェット/コンポジットのコンストラクターですべての準備ロジックを実行することをお勧めしますが、onLoadコールバックで実際の描画を行うことをお勧めします。これは、オーバーライドする必要があります。このコールバックは、ウィジェットがブラウザドキュメントに読み込まれたときに呼び出されます。その場合にのみ、コントロールの有効化/無効化やフォーカスの要求など、ページ/レイアウトの操作を実行できます。

于 2010-04-30T06:56:58.127 に答える
3

どちらの方法でもうまくいくでしょう。Visualization APIがページ上のさまざまなウィジェットで使用されている場合は、loadVisualizationApi呼び出しをEntryPointクラスに入れる方が簡単な場合があります。この例を以下に示します。

Compositeあなたはそのように書くことができます:

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);
  }
}

そして、これを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);
  }
于 2010-04-29T21:40:15.507 に答える