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