Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GWT谷歌图表在增长,但不会';收缩_Javascript_Java_Gwt_Google Visualization - Fatal编程技术网

Javascript GWT谷歌图表在增长,但不会';收缩

Javascript GWT谷歌图表在增长,但不会';收缩,javascript,java,gwt,google-visualization,Javascript,Java,Gwt,Google Visualization,我正在使用GWT(版本2.7)和在GWT应用程序中绘制一系列图表 我试图在一个滚动面板中显示多个图表,右边有一个数据部分。数据部分的宽度是固定的,包含图表的滚动面板应该占据窗口宽度的其余部分。当窗口大小更改时,图表的大小应该更改。这是一张照片: 我的这个基本上是有效的。当我增大窗口大小时,图表会增大,但是当我减小窗口大小时,图表区域不会缩小 我想图表区域的增长和缩小根据窗口的大小。现在,增长部分有效,但收缩部分无效 下面是示例的代码: package com.example.gwtchart

我正在使用GWT(版本2.7)和在GWT应用程序中绘制一系列图表

我试图在一个滚动面板中显示多个图表,右边有一个数据部分。数据部分的宽度是固定的,包含图表的滚动面板应该占据窗口宽度的其余部分。当窗口大小更改时,图表的大小应该更改。这是一张照片:

我的这个基本上是有效的。当我增大窗口大小时,图表会增大,但是当我减小窗口大小时,图表区域不会缩小

我想图表区域的增长和缩小根据窗口的大小。现在,增长部分有效,但收缩部分无效

下面是示例的代码:

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文件。这里唯一值得注意的是,我将Google Charts JavaScript api包含在
标题中
部分:

<!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>

GWT图表测试

我推测,
ScrollPanel
永远不会减小其大小,即使其父级
DockLayoutPanel
的大小减小我如何保证即使窗口的大小减小,图表也能继续保持窗口的大小?

您可能需要将调用包装起来,以便在图形中绘制图表。它们是在Window>DockLayoutPanel>ScrollPanel链有机会调整大小之前制作的

或者,如果您只支持现代浏览器,我建议您转向flexbox布局模型,因为它使用本机浏览器回流而不是JavaScript,因此更高效、更灵活(双关语)

编辑:

解决方案是用FlowPanel替换VerticalPanel


VerticalPanel扩展了CellPanel,它解析为HTML格式的表。它的布局机制不同于简单的
div
,通常应该避免使用,除非有非常具体的原因使用它,并且没有基于CSS的解决方案可用。一般来说,出于性能原因和获得可预测的一致性行为,我们应该尽可能接近浏览器本机布局机制(FlowPanel、HTMLPanel、CSS)。一旦您混合使用本机和JS强制布局,您必须非常小心事件的顺序,因为JS代码所做的更改(例如调整元素大小)可能会迫使浏览器再次回流/重新呈现整个页面,这反过来可能会通过许多小部件中实现的ProvidesResize/RequiresResize机制导致更多JS更改(DockLayoutPanel、ScrollPanel等)

您可能需要将调用包装成一个图表。这些调用是在Window>DockLayoutPanel>ScrollPanel链有机会调整大小之前进行的

或者,如果您只支持现代浏览器,我建议您转向flexbox布局模型,因为它使用本机浏览器回流而不是JavaScript,因此更高效、更灵活(双关语)

编辑:

解决方案是用FlowPanel替换VerticalPanel


VerticalPanel扩展了CellPanel,它解析为HTML格式的表。它的布局机制不同于简单的
div
,通常应该避免使用它,除非有非常具体的原因使用它,并且没有基于CSS的解决方案可用。一般来说,我们应该尽量接近浏览器的本机布局机制(FlowPanel、HTMLPanel、CSS)出于性能原因和获得可预测的一致性行为两方面的考虑,尽可能多地使用。一旦您混合使用本机和JS强制布局,您必须非常小心JS代码所做更改的事件顺序(例如,调整元素大小)可能会迫使浏览器再次回流/重新呈现整个页面,从而通过在许多小部件(DockLayoutPanel、ScrollPanel等)中实现的ProvidesResize/RequiresResize机制导致更多JS更改

如果您在ReziseHandler上读取您希望图表的实际宽度,您可以将其作为参数传递给
drawChart
函数,然后在图表的选项中指定宽度,也许?@HenrikAronsson问题不是真正的图表,而是绘制图表的组件。
滚动面板
增长,垂直面板占据其宽度的100%,然后绘制图表的SimplePanels占据其宽度的100%。这些都是正确的大小。问题是
100%
并不会随着大小的减小而改变。如果你在ReziseHandler上阅读actu如果您希望图表的宽度是多少,您可以将其作为参数传递给
drawChart
函数,然后在图表的选项中指定宽度,也许吧?@HenrikAronsson问题不是真正的图表,而是绘制图表的组件。
滚动面板
增长,而
垂直面板
>占用
100%
宽度,然后绘制图表的
SimplePanels
占用
100%
宽度。这些都是正确的大小。问题是
100%
的大小不会随着大小的减小而改变。感谢您的回复,但是将调用封装在
调度程序中看不到我希望有一个效果。flexbox似乎是html和css的东西,但我使用的是GWT。我真正的项目比这个示例项目大得多,我不能简单地用flexbox而不是GWT来重做布局。用FlowPanel替换VerticalPanel-这是一个好主意,不管这个问题如何。注意,不需要设置FlowPanel或Sim的宽度plePanel to 100%-默认情况下,所有
div
元素占据所有可用宽度。我最近的所有应用程序都在GWT和flexbox中,我尽量避免使用各种布局面板。Google Daniel Kurka的视频解释了MGWT为什么使用flexbox模型而不使用布局面板-同样的逻辑适用于所有GWT项目。Switc兴至流动事务委员会