开发者社区> 问答> 正文

关于ofcgwt图表显示组件:报错

@朱宗鑫1 你好,想跟你请教个问题:


请问一下用过ofcgwt显示图表的组件没有!并请给出一个读取数据库数据并在ofcgwt上显示的具体例子好吗? 邮箱:dixuexiongying1234@163.com QQ:372089866 不胜感激

展开
收起
kun坤 2020-06-06 16:25:09 484 0
1 条回答
写回答
取消 提交回答
  • 没用过,不过看了下它其实就是这个项目的延伸http://teethgrinder.co.uk/open-flash-chart-2/

    只要数据库取出来的数据组织成他指定的JSON格式就可以:
    http://teethgrinder.co.uk/open-flash-chart-2/tutorial-6.php

    看例子:http://ofcgwt.googlecode.com/svn/demo/Demo.html


    看了下他也只是封装了下,你看下

    http://ofcgwt.googlecode.com/svn/trunk/src/com/rednels/ofcgwt/client/ChartWidget.java

    这个文件,里面主要是几个函数

    private native void loadJSON(String id, String json)
    /*
    Copyright (C) 2009 Grant Slender
    
    This file is part of OFCGWT.
    http://code.google.com/p/ofcgwt/
    
    OFCGWT is free software: you can redistribute it and/or modify
    it under the terms of the Lesser GNU General Public License as
    published by the Free Software Foundation, either version 3 of
    the License, or (at your option) any later version.
    
    OFCGWT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    See <http://www.gnu.org/licenses/lgpl-3.0.txt>.
     */
    package com.rednels.ofcgwt.client;
    
    import java.util.Date;
    import java.util.List;
    
    import com.google.gwt.core.client.GWT;
    import com.google.gwt.user.client.DOM;
    import com.google.gwt.user.client.Element;
    import com.google.gwt.user.client.ui.Widget;
    import com.rednels.ofcgwt.client.event.ChartClickEvent;
    import com.rednels.ofcgwt.client.event.ChartClickHandler;
    import com.rednels.ofcgwt.client.event.DataValueEvents;
    import com.rednels.ofcgwt.client.event.KeyClickHandler;
    import com.rednels.ofcgwt.client.model.ChartData;
    
    /**
     * A gwt chart widget based on Open Flash Chart.</br></br>
     * 
     * Create the ChartWidget and add anywhere a GWT widget can be used. Use the
     * model {@link ChartData} to build a chart and then pass to
     * {@link ChartWidget#setChartData(ChartData)} and it will generate and set the
     * correct JSON data.
     * <p/>
     * You can also set JSON via the {@link #setJsonData(String)} method.
     * 
     */
    public class ChartWidget extends Widget {
    	public static final String MIN_PLAYER_VERSION = "9.0.0";
    	public static final String ALTERNATE_SWF_SRC = "expressInstall.swf";
    
    	private static final CacheFixImpl cacheFixImpl = GWT.create(CacheFixImpl.class);
    	private static int count = 0;
    
    	private boolean isSWFInjected = false;
    	private boolean cacheFixEnabled = false;
    	private boolean hasFlashPlayer = false;
    	private String swfId;
    	private String swfDivId;
    	private String jsonData = ChartFactory.BLANK_CHART_JSON_DATA;
    	private String width = "100%";
    	private String height = "100%";
    	private String innerDivTextForFlashPlayerNotFound = "FlashPlayer ${flashPlayer.version} is required.";
    	private String flashurl = "ofcgwt/open-flash-chart.swf";
    	private String urlPrefix = GWT.getModuleBaseURL();
    	private ChartData chartData;
    	private Element chartElement;
    
    	/**
    	 * Creates a new ChartWidget. *
    	 */
    	public ChartWidget() {
    		swfId = "swfID_" + count;
    		swfDivId = "swfDivID_" + count;
    		++count;
    		chartElement = DOM.createElement("div");
    		DOM.setElementProperty(chartElement, "id", swfDivId);
    		setElement(chartElement);
    		setSize(width, height);
    		hasFlashPlayer = hasFlashPlayerVersion(MIN_PLAYER_VERSION);
    		cacheFixEnabled = cacheFixImpl.isCacheFixNeeded();
    	}
    
    	/**
    	 * Gets the current OFC flash URL. Defaults to just "open-flash-chart.swf"
    	 * 
    	 * @return the flashurl
    	 */
    	public String getFlashUrl() {
    		return flashurl;
    	}
    
    	/**
    	 * Gets the objects height.
    	 * 
    	 * @return height
    	 */
    	public String getHeight() {
    		return height;
    	}
    
    	/**
    	 * Gets the InnerDiv Text for when flash player is not found or can't be
    	 * injected.
    	 * 
    	 * @return string
    	 */
    	public String getInnerDivTextForFlashPlayerNotFound() {
    		return innerDivTextForFlashPlayerNotFound;
    	}
    
    	/**
    	 * Gets the current JSON data for this chart.
    	 * 
    	 * @return a JSON string
    	 */
    	public String getJsonData() {
    		return jsonData;
    	}
    
    	/**
    	 * @return the swfId
    	 */
    	public String getSwfId() {
    		return swfId;
    	}
    
    	/**
    	 * @return the urlPrefix
    	 */
    	public String getUrlPrefix() {
    		return urlPrefix;
    	}
    
    	/**
    	 * Gets the objects width.
    	 * 
    	 * @return width
    	 */
    	public String getWidth() {
    		return width;
    	}
    
    	/**
    	 * Is the CacheFix Enabled?
    	 * 
    	 * @return true if cache fix is enabled, false if not
    	 */
    	public boolean isCacheFixEnabled() {
    		return cacheFixEnabled;
    	}
    
    	/**
    	 * Obtains raw image data of this chart. Call returns null if the flash
    	 * chart is not loaded.
    	 * 
    	 * @return String chart image data
    	 */
    	public String getImageData() {
    		if (hasFlashPlayer && isSWFInjected) {
    			return getImageData(getSwfId());
    		}
    		return null;
    	}
    
    	/**
    	 * Enables an fix/workaround that stops caching of the swf which on IE may
    	 * solve some bugs. The workaround adds a unique parameter url to each SWF
    	 * making each chart widget non-cachable. On IE this feature is enabled by
    	 * default, other agents it is disabled. </br></br>Enable this if you find
    	 * problems in with multiple charts.
    	 * 
    	 * @param enable
    	 *            - true to enable, false to disable
    	 */
    	public void setCacheFixEnabled(boolean enable) {
    		this.cacheFixEnabled = enable;
    	}
    
    	/**
    	 * Sets this charts ChartData and processes it for handlers/events
    	 * 
    	 * @param cd
    	 *            the ChartData model
    	 */
    	public void setChartData(ChartData cd) {
    		this.chartData = cd;
    		for (com.rednels.ofcgwt.client.model.elements.Element e : chartData.getElements()) {
    			// add chart click events...
    			for (ChartClickHandler cch : e.getChartClickHandlers()) {
    				String onclick = "ofc_onclick('" + getSwfId() + "','" + cch.hashCode() + "')";
    				e.setOnClick(onclick);
    			}
    			// add key click events...
    			for (KeyClickHandler kch : e.getKeyClickHandlers()) {
    				String onclick = "ofc_onclick('" + getSwfId() + "','" + kch.hashCode() + "')";
    				e.setKeyOnClick(onclick);
    			}
    			for (Object o : e.getValues()) {
    				if (o instanceof DataValueEvents) {
    					// add data value click events...
    					DataValueEvents dve = (DataValueEvents) o;
    					for (ChartClickHandler ch : dve.getHandlers()) {
    						String onclick = "ofc_onclick('" + getSwfId() + "','" + ch.hashCode() + "')";
    						dve.setOnClick(onclick);
    					}
    				}
    			}
    		}
    		setJsonData(chartData.buildJSON().toString());
    	}
    
    	/**
    	 * Sets the OFC flash URL. ie "\path\open-flash-chart.swf"
    	 * 
    	 * @param url
    	 *            string
    	 */
    	public void setFlashUrl(String url) {
    		this.flashurl = url;
    	}
    
    	public void setHeight(String height) {
    		height = height.trim().toLowerCase();
    		super.setHeight(height); // Width validation
    		this.height = height;
    		if (getHeight().equals(height)) {
    			if (isSWFInjected) {
    				Element elem = DOM.getFirstChild(getElement());
    				DOM.setElementAttribute(elem, "height", height);
    			}
    		}
    
    	}
    
    	/**
    	 * Sets the InnerDiv Text for when flash player is not found or can't be
    	 * injected. <br>
    	 * Defaults to "FlashPlayer ${flashPlayer.version} is required."
    	 * 
    	 * @param divtext
    	 *            a string
    	 */
    	public void setInnerDivTextForFlashPlayerNotFound(String divtext) {
    		this.innerDivTextForFlashPlayerNotFound = divtext;
    	}
    
    	/**
    	 * Sets the JSON data for this chart & updates the chart if ready. Does
    	 * nothing if the required flash player is not loaded.
    	 * 
    	 * @param json
    	 *            a JSON string
    	 */
    	public void setJsonData(String json) {
    		// System.out.println(json);
    		this.jsonData = json;
    		if (hasFlashPlayer && isSWFInjected) {
    			loadJSON(swfId, jsonData);
    		}
    	}
    
    	/**
    	 * Sets the url prefix of the OFC flash swf file. Defaults to the value of
    	 * GWT.getModuleBaseURL()
    	 * 
    	 * @param urlPrefix
    	 *            a URL string
    	 */
    	public void setUrlPrefix(String urlPrefix) {
    		this.urlPrefix = urlPrefix;
    	}
    
    	public void setWidth(String width) {
    		width = width.trim().toLowerCase();
    		super.setWidth(width); // Width validation
    		this.width = width;
    		if (getWidth().equals(width)) {
    			if (isSWFInjected) {
    				Element elem = DOM.getFirstChild(getElement());
    				DOM.setElementAttribute(elem, "width", width);
    			}
    		}
    	}
    
    	protected void doOnChartClick(String evt) {
    		for (com.rednels.ofcgwt.client.model.elements.Element e : chartData.getElements()) {
    			for (Object o : e.getValues()) {
    				if (o instanceof DataValueEvents) {
    					DataValueEvents ee = (DataValueEvents) o;
    					for (ChartClickHandler ch : ee.getHandlers()) {
    						if (evt.equals("" + ch.hashCode())) {
    							ch.onClick(new ChartClickEvent());
    						}
    					}
    				}
    			}
    		}
    	}
    
    	protected List<ChartClickHandler> getHandlers() {
    		return null;
    	}
    
    	protected void onAttach() {
    		chartElement.setInnerHTML("<div id=\"embed_" + swfId + "\">" + emptyInnerDiv() + "</div>");
    		ChartFactory.get().register(this);
    		if (!isSWFInjected) {
    			injectSWF(getInternalSWFURL(isCacheFixEnabled(), urlPrefix + flashurl, swfId), swfId, getWidth(), getHeight(), MIN_PLAYER_VERSION, ALTERNATE_SWF_SRC);
    			isSWFInjected = true;
    		}
    		super.onAttach();
    	}
    
    	protected void onDetach() {
    		ChartFactory.get().unregister(this);
    		chartElement.removeChild(chartElement.getChildNodes().getItem(0));
    		isSWFInjected = false;
    		super.onDetach();
    
    	}
    
    	private String emptyInnerDiv() {
    		return getInnerDivTextForFlashPlayerNotFound().replaceAll("\\$\\{flashPlayer.version\\}", MIN_PLAYER_VERSION);
    	}
    
    	/**
    	 * Used internally to returns the correct open flash chart swf url
    	 * 
    	 * @return the swf url string
    	 */
    	private String getInternalSWFURL(boolean iefix, String flashurl, String id) {
    		if (!iefix) return flashurl;
    		return flashurl + ("?id=" + id + (new Date().getTime()));
    	}
    
    	private native boolean hasFlashPlayerVersion(String v)
    	/*-{	    
    	  	return $wnd.swfobject.hasFlashPlayerVersion(v);	        
    	}-*/;
    
    	private native void injectSWF(String swf, String id, String w, String h, String ver, String alt)
    	/*-{ 	     
    		var flashvars = {id: id,allowResize: true};
    		var params = {scale: 'noscale', allowscriptaccess:'always',wmode: 'transparent'};		
    	    var attributes = { data: swf, width: w, height: h, id: id, name: id };
    		$wnd.swfobject.embedSWF(swf, "embed_"+id, w, h, ver, alt, flashvars, params, attributes);
    	}-*/;
    
    	private native void loadJSON(String id, String json)
    	/*-{				
    		var swf = $doc.getElementById(id);
    		if ('load' in swf) swf.load(json);
    	}-*/;
    
    	private native String getImageData(String id)
    	/*-{				
    		var swf = $doc.getElementById(id);
    		var data = null;
    		if ('get_img_binary' in swf) data = swf.get_img_binary();
    		return data;
    	}-*/;
    }

    2020-06-06 16:25:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据展现:可视化报表及嵌入应用 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载