我正在尝试编写一个简单的应用程序来显示图表数据。我想在用户加载页面时立即显示一些数据,所以我得到数据和数据。如gwt-visualization Getting Started中所述,在Runnable
内绘制表格。
事情似乎没有问题,除了图表往往不止一次加载。以下是我的onModuleLoad()
。
private final StatisticsServiceAsync statisticsService = GWT.create(StatisticsService.class);
GWTBeanFactory factory = GWT.create(GWTBeanFactory.class);
DataTable locationData;
AnnotatedTimeLine atl;
GeoMap usMap;
TextBox storeField;
Button log10Button;
DateRange durationChartRange;
String eusrJson = null;
Button b;
HTML last1000Html;
public void onModuleLoad() {
storeField = new TextBox();
storeField.setText("Enter a store");
storeField.addKeyDownHandler(new MyKeyHandler());
b = new Button("Get Stats!");
log10Button = new Button("Show Log10 Scale");
log10Button.addClickHandler(new Log10ClickHandler());
b.addClickHandler(new MyClickHandler());
last1000Html = new HTML();
getLast1000Avg();
Runnable onLoadCallback = new Runnable() {
public void run() {
storeDurationData = DataTable.create();
storeDurationDataLog10 = DataTable.create();
RootPanel.get("storeDurationDiv").add(storeField);
RootPanel.get("storeDurationDiv").add(b);
RootPanel.get("storeDurationDiv").add(log10Button);
RootPanel.get("storeDurationDiv").add(last1000Html);
log10Button.setVisible(false);
// Get initial Data
getAvgByRegion();
getLast1000Avg();
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
getLast1000Avg();
return true;
}
}, 5000);
}
};
// Load the visualization api, passing the onLoadCallback to be called
// when loading is done.
VisualizationUtils.loadVisualizationApi(onLoadCallback, AnnotatedTimeLine.PACKAGE);
VisualizationUtils.loadVisualizationApi(onLoadCallback, GeoMap.PACKAGE);
}
所有“简单”元素似乎都已正确填充,因为Button
,HTML
和TextBox
都已正确放置(过去曾在{{1 ,它们现在是调试先前错误的结果。)但是,run
会被放置两次,并且查看日志记录,您可以判断GeoMap
的{{1}}正在执行至少两次,这似乎是合理的,但我不是知道如何防止它添加两次。
我可能搞砸了Async的东西,但我很新并且很困惑。以下是我的Runnable
方法:
run
欢迎任何关于如何最好地使用GWT的建议。
答案 0 :(得分:1)
所以,你拨打VisualizationUtils.loadVisualizationApi
两次,所以onLoadCallback
将会运行两次(我不知道GWT Google Apis,这是一个假设)。
onLoadCallback
调用getAvgByRegion
,这样一个人也会被调用两次;并且它获取数据并在回调中创建新的GeoMap
并将添加到RootPanel.get("storeDurationDiv")
,因此您在屏幕上获得两个GeoMap
。
其他小部件(storeField
等)只创建一次,因此重复add
不是问题(性能方面除外),因为它们将首先从其中删除当前父级在添加到新父级之前(在这种情况下是相同的)