2016-07-07 3 views
0

私はGWT(バージョン2.7)とGoogle Charts JavaScript APIを使って、GWTアプリケーション内で一連のチャートを描画しています。GWT Googleグラフは成長するが縮小しない

私はスクロールパネルに複数のグラフを表示しようとしていますが、右側にデータセクションがあります。データセクションは固定幅で、チャートを含むスクロールパネルは残りのウィンドウ幅を占める必要があります。ウィンドウサイズが変わると、グラフのサイズが変わるはずです。ここで絵です:

私は、これは主に取り組んでいます。グラフのサイズが大きくなるにつれて、グラフのサイズは大きくなりますが、ですが、ウィンドウのサイズを小さくするとグラフの領域は縮小しません。

は私が成長し、ウィンドウのサイズに合わせて縮小するグラフ領域をしたいと思います。成長している部分は機能しますが、収縮する部分は機能しません。

はここで例のコードです:

package com.example.gwtcharttest.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.dom.client.Style.Unit; 
import com.google.gwt.event.logical.shared.ResizeEvent; 
import com.google.gwt.event.logical.shared.ResizeHandler; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.DockLayoutPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootLayoutPanel; 
import com.google.gwt.user.client.ui.ScrollPanel; 
import com.google.gwt.user.client.ui.SimplePanel; 
import com.google.gwt.user.client.ui.VerticalPanel; 


public class GwtChartTest implements EntryPoint { 

    public void onModuleLoad() { 

     final SimplePanel chartDivOne = new SimplePanel(); 
     chartDivOne.getElement().setId("chartDiv_1"); 
     chartDivOne.setHeight("300px"); 
     chartDivOne.setWidth("100%"); 

     final SimplePanel chartDivTwo = new SimplePanel(); 
     chartDivTwo.getElement().setId("chartDiv_2"); 
     chartDivTwo.setHeight("300px"); 
     chartDivTwo.setWidth("100%"); 

     final SimplePanel chartDivThree = new SimplePanel(); 
     chartDivThree.getElement().setId("chartDiv_3"); 
     chartDivThree.setHeight("300px"); 
     chartDivThree.setWidth("100%"); 

     VerticalPanel chartsPanel = new VerticalPanel(); 
     chartsPanel.setWidth("100%"); 
     chartsPanel.add(chartDivOne); 
     chartsPanel.add(chartDivTwo); 
     chartsPanel.add(chartDivThree); 

     ScrollPanel chartsScrollPanel = new ScrollPanel(chartsPanel); 

     DockLayoutPanel dlp = new DockLayoutPanel(Unit.PX); 
     dlp.addEast(new Label("some data here"), 200); 
     dlp.add(chartsScrollPanel); 

     RootLayoutPanel.get().add(dlp); 

     loadLibrary(); 

     Window.addResizeHandler(new ResizeHandler() { 

      @Override 
      public void onResize(ResizeEvent event) { 
       drawChart("chartDiv_1"); 
       drawChart("chartDiv_2"); 
       drawChart("chartDiv_3"); 
      } 
     }); 
    } 

    private native void drawChart(String chartDivId)/*-{ 

      var data = $wnd.google.visualization.arrayToDataTable([ 
      ['City', '2010 Population',], 
      ['New York City, NY', 8175000], 
      ['Los Angeles, CA', 3792000], 
      ['Chicago, IL', 2695000], 
      ['Houston, TX', 2099000], 
      ['Philadelphia, PA', 1526000] 
      ]); 

      var options = { 
      title: 'Population of Largest U.S. Cities', 

      hAxis: { 
       title: 'Total Population', 
       minValue: 0 
      }, 
      vAxis: { 
       title: 'City' 
      } 
      }; 

      var chart = new $wnd.google.visualization.ColumnChart($wnd.document.getElementById(chartDivId)); 
      chart.draw(data, options); 
    }-*/; 

    private native void loadLibrary()/*-{ 
     $wnd.google.charts.load('current', { 
      packages : [ 'corechart' ] 
     }); 
    }-*/; 
} 

そしてここでhtmlファイルです。私は親DockLayoutPanelのサイズが減少した場合でもScrollPanelは、そのサイズを小さくすることはありませんされていることを集める

<!doctype html> 
<html> 
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <link type="text/css" rel="stylesheet" href="GwtChartTest.css"> 
    <title>GWT Chart Test</title> 
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
    <script type="text/javascript" language="javascript" src="gwtcharttest/gwtcharttest.nocache.js"></script> 
    </head> 

    <body> 
    </body> 
</html> 

:ここで注目すべき唯一のことは、私がheadセクション内のJavaScript API、Googleのチャートを含むだということです。 チャートがウィンドウのサイズを尊重し続けることを保証するにはどうしたらいいですか?

+0

ReziseHandlerでチャートを表示する実際の幅を読み取った場合、パラメータを 'drawChart'関数に渡してから、グラフのオプションに幅を指定してください。 –

+0

@HenrikAronsson問題は本当にチャートではなく、チャートが描かれているコンポーネントです。'ScrollPanel'が大きくなり、' VerticalPanel'がその幅の '100%'をとり、チャートが描画される 'SimplePanels'がその' 100% 'を占めます。それらはすべて正しいサイズです。問題は、サイズが小さくなるにつれて '100%'は何も変わらないということです。 –

答えて

2

図表描画の呼び出しをSchedulerにラップする必要がある場合があります。ウィンドウ> DockLayoutPanel> ScrollPanelチェーンのサイズを変更する前に、それらが作成されます。

また、現代のブラウザのみをサポートしている場合は、JavaScriptの代わりにネイティブブラウザのリフローを使用するので、はるかに効率的で柔軟性のあるフレックスボックスレイアウトモデルに移行することをおすすめします。

EDIT:

ソリューションはFlowPanelでVerticalPanelを交換しました。

VerticalPanelは、HTMLの表に解決されるCellPanelを拡張します。それは単純なdivとは違ったレイアウトメカニズムを持っているため、使用する特別な理由がなく、CSSベースのソリューションが利用可能でない限り、一般的には避けるべきです。一般的には、パフォーマンス上の理由から、また予測可能な一貫した動作を得るために、ブラウザのネイティブレイアウトメカニズム(FlowPanel、HTMLPanel、CSS)にできる限り近づけてください。ネイティブとJS強制レイアウトを混在させたら、JSコードで行われた変更(たとえば要素のサイズ変更)によってブラウザが再度ページ全体をリフロー/再描画する可能性があるため、イベントのシーケンスについて非常に注意する必要があります。多くのウィジェット(DockLayoutPanel、ScrollPanelなど)に実装されているProvidesResize/RequiresResizeメカニズムを使用してJSの変更が多く発生します。

+0

返信いただきありがとうございますが、 'Scheduler'の中で呼び出しをラップすることは効果がないようです。フレックスボックスはHTMLやCSSのようですが、私はGWTを使っています。実際のプロジェクトはこのサンプルプロジェクトよりもはるかに大きく、GWTではなくflexboxでレイアウトをやり直すことはできません。 –

+0

VerticalPanelをFlowPanelに置き換えてください。この問題に関係なく良いアイデアです。 FlowPanelまたはSimplePanelの幅を100%に設定する必要はないことに注意してください。デフォルトでは、すべてのdiv要素はすべての幅を利用できます。 –

+0

私の最近のすべてのアプリケーションはGWTとフレックスボックスにあり、可能な限り、あらゆる種類のLayoutPanelsを避けようとしています。 MGWTがフレックスボックスモデルを使用し、レイアウトパネルを使用していない理由を説明するGoogleのDaniel Kurkaのビデオ - すべてのGWTプロジェクトに同じロジックが適用されます。 –

関連する問題