1

未知数のグラフ (Google ビジュアライゼーション) を含む未知数のタブをそれぞれ表示する必要があります。「Tab」および「Graph」クラスを作成しましたが、Tab には ArrayList が含まれています。

TabWrappers は FlexTable を拡張し、現在空です。現時点ではプレースホルダーですが、TabWrapper ではなく FlexTable を使用しても動作は変わりません。

以下のコードから、Tab2 を追加するセクションを除いたものは、グラフが表示された 1 つのタブを作成するのに完全に機能します。2 番目のタブを追加すると、両方のタブが正しく表示され、名前が付けられますが、グラフは表示されません。

    public class SomeClass {

...

        DataTable data = response.getDataTable();
        DataView result;
        Options options = createOptions();

        ArrayList<Tab> displayTab = new ArrayList<Tab>();
        Tab t;
        ArrayList<Graph> graphList = new ArrayList<Graph>();
        Graph g;

        t = new Tab();

            g = new Graph();
            result = DataView.create(data);
            result.setRows(new int[]{0, 2, 4, 6});
            g.setGraphType(new PieChart(result, options));
            graphList.add(g);

            g = new Graph();
            result = DataView.create(data);
            result.setRows(new int[]{1, 3, 5, 7});
            g.setGraphType(new PieChart(result, options));
            graphList.add(g);

            g = new Graph();
            result = DataView.create(data);
            g.setGraphType(new PieChart(result, options));
            graphList.add(g);

        t.setTabName("Tab1");
        t.setGraphs(graphList);
        displayTab.add(t);
        // Add a 2nd tab
        t = new Tab();
        t.setTabName("Tab2");
        t.setGraphs(graphList);
        displayTab.add(t);

        TabWrapper tabWrapper;
        for (Tab tX : displayTab){
            int row = 0, col = 0, maxCol = 2;
            tabWrapper = new TabWrapper();
            for (Graph gX : tX.getGraphs()) {
                col = tX.getGraphs().indexOf(gX) - (row * maxCol);
                tabWrapper.setWidget(row, col, gX.getGraphType().asWidget());
                if (++col == maxCol) {
                    row++;
                }
            }
        tabPanel.add(tabWrapper, tX.getTabName());
        }

...

    }
4

1 に答える 1

2

GWT でタブを使用すると、各タブに保持されているパネルが遅延ロードされているように見え、ユーザーが各タブをクリックするまで完全にセットアップされません。

特に、タブ コンテナーの幅と高さがゼロになるため (エラー ログには、コンテナーの幅がゼロであるというエラーが表示される可能性があります)、グラフの描画は失敗し、空のスペースが残ります。

あなたがしなければならないこと(そしておそらく良い習慣です)は、タブが完全に設定されたときにのみグラフがロードされるように、タブのコンテンツも遅延ロードすることです。これは、t.setGraphs(...)の呼び出しを削除し、代わりにそれを行う選択ハンドラーを追加することで実行できます。

tabPanel.addSelectionHandler(new SelectionHandler<Integer> () {
    public void onSelection(SelectionEvent<Integer> event) {
        // Pseudocode:
        // n = event.getSelectedItem()
        // t = displayTab[n]
        // g = graphList[n]
        // t.setGraphs(g)
    }
});

タブが選択されている場合にのみグラフが追加および描画されるようにします。

あなたもおそらく電話したいと思うでしょう

tabPanel.selectTab(0);

選択ハンドラーが配置された後、最初のタブの選択を強制します。

あなたが説明したのと同じ問題があり、これで解決しました。

于 2011-09-09T03:13:27.183 に答える