Processing...
Description & Source Code
  • Description
  • View
    line_chart.zul
    line_chart_ctrl.zul
  • View Model
    LineChartVM.java
    LineChartConfigVM.java
    LineChartEngine.java
  • Model
    ChartData.java
    ChartColors.java

A simple example of a line chart.
Using ZK's engine, users can easily customize the line, points and color of chart.

line_chart.zul
<vlayout apply="org.zkoss.bind.BindComposer" 
	viewModel="@id('vm') @init('demo.chart.line.LineChartVM')">
	<chart id="chart" title="Half-Year Report" width="520" height="350" paneColor="#FFFFFF"
		type="line" yAxis="Amount"
		model="@bind(vm.model)" engine="@bind(vm.engine)" threeD="@bind(vm.threeD)"
		onClick="@command('showMessage',msg=event.areaComponent.tooltiptext)"/>
	<hlayout visible="@bind(not empty vm.message)">
		You clicked on :<label value="@bind(vm.message)"/>
	</hlayout>
</vlayout>
line_chart_ctrl.zul
<vlayout apply="org.zkoss.bind.BindComposer" 
	viewModel="@id('vm') @init('demo.chart.line.LineChartConfigVM')">
	<checkbox label="Toggle 3D Chart" 
		checked="@bind(vm.threeD)" 
		onCheck="@global-command('configChanged',threeD=vm.threeD,showLine=vm.showLine,showShape=vm.showShape)"/>
	<checkbox label="Show Line Shape" 
		checked="@bind(vm.showShape)" visible="@bind(not vm.threeD)"
		onCheck="@global-command('configChanged',showShape=vm.showShape)"/>		
	<checkbox label="Show Lines (Actual, Establishment)" 
		checked="@bind(vm.showLine)" visible="@bind(not vm.threeD)"
		onCheck="@global-command('configChanged',showLine=vm.showLine)"/>
	<vlayout spacing="5px" visible="@bind(not vm.threeD)" >
		Line Width : 
		<spinner constraint="no negative,no zero,no empty,min 1, max 10" width="100px" instant="true" 
			value="@bind(vm.width)"
			onChange="@global-command('configChanged',width=vm.width)"/>
	</vlayout>
</vlayout>
LineChartVM.java
package demo.chart.line;

import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zul.CategoryModel;

public class LineChartVM {

	CategoryModel model;
	LineChartEngine engine;
	String message;
	
	boolean threeD;

	@Init
	public void init() {
		engine = new LineChartEngine();
		model = ChartData.getModel();
	}

	public LineChartEngine getEngine() {
		return engine;
	}

	public CategoryModel getModel() {
		return model;
	}
	
	public String getMessage() {
		return message;
	}

	public boolean isThreeD() {
		return threeD;
	}

	@Command("showMessage") 
	@NotifyChange("message")
	public void onShowMessage(
			@BindingParam("msg") String message){
		this.message = message;
	}
	
	@GlobalCommand("configChanged") 
	@NotifyChange({"threeD","engine"})
	public void onConfigChanged(
			@BindingParam("threeD") Boolean threeD,
			@BindingParam("showLine") Boolean showLine,
			@BindingParam("showShape") Boolean showShape,
			@BindingParam("width") Integer width){
		if (threeD != null) {
			this.threeD = threeD;
		}

		if (showLine != null) {
			engine.setShowLine(showLine);
		}

		if (showShape != null) {
			engine.setShowShape(showShape);
		}

		if (width != null) {
			engine.setWidth(width);
		}
	}
}
LineChartConfigVM.java
package demo.chart.line;

public class LineChartConfigVM {

	boolean threeD = false;
	boolean showLine = true;
	boolean showShape = true;
	int width = 2;

	public boolean isThreeD() {
		return threeD;
	}

	public void setThreeD(boolean threeD) {
		this.threeD = threeD;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public boolean isShowLine() {
		return showLine;
	}

	public void setShowLine(boolean showLine) {
		this.showLine = showLine;
	}

	public boolean isShowShape() {
		return showShape;
	}

	public void setShowShape(boolean showShape) {
		this.showShape = showShape;
	}

}
LineChartEngine.java
package demo.chart.line;

import java.awt.BasicStroke;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.zkoss.zkex.zul.impl.JFreeChartEngine;
import org.zkoss.zul.Chart;

import demo.chart.ChartColors;

/*
 * you are able to do many advanced chart customization by extending ChartEngine
 */
public class LineChartEngine extends JFreeChartEngine {

	public int width = 2;
	public boolean showLine = true;
	public boolean showShape = true;

	public boolean prepareJFreeChart(JFreeChart jfchart, Chart chart) {
		LineAndShapeRenderer renderer = (LineAndShapeRenderer) ((CategoryPlot) jfchart.getPlot()).getRenderer();
		renderer.setSeriesStroke(0, new BasicStroke(width));
		renderer.setSeriesStroke(1, new BasicStroke(width));
		renderer.setSeriesStroke(2, new BasicStroke(width));

		renderer.setSeriesLinesVisible(0, chart.isThreeD());
		renderer.setSeriesLinesVisible(1, showLine);
		renderer.setSeriesLinesVisible(2, showLine);

		renderer.setSeriesShapesVisible(0, showShape);
		renderer.setSeriesShapesVisible(1, showShape);
		renderer.setSeriesShapesVisible(2, showShape);
		
		renderer.setSeriesPaint(0, ChartColors.COLOR_1);
		renderer.setSeriesPaint(1, ChartColors.COLOR_2);
		renderer.setSeriesPaint(2, ChartColors.COLOR_3);
		return false;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public void setShowLine(boolean showLine) {
		this.showLine = showLine;
	}

	public void setShowShape(boolean showShape) {
		this.showShape = showShape;
	}
}
ChartData.java
package demo.chart.line;

import org.zkoss.zul.CategoryModel;
import org.zkoss.zul.SimpleCategoryModel;

public class ChartData {
	
	public static CategoryModel getModel() {
		CategoryModel model = new SimpleCategoryModel();
		String[] category = { "Predict", "Actual", "Establishment" };
		model.setValue(category[0], "Jan", new Integer(25));
		model.setValue(category[0], "Feb", new Integer(35));
		model.setValue(category[0], "Mar", new Integer(45));
		model.setValue(category[0], "Apr", new Integer(48));
		model.setValue(category[0], "May", new Integer(53));
		model.setValue(category[0], "Jun", new Integer(62));

		model.setValue(category[1], "Jan", new Integer(28));
		model.setValue(category[1], "Feb", new Integer(33));
		model.setValue(category[1], "Mar", new Integer(40));
		model.setValue(category[1], "Apr", new Integer(53));
		model.setValue(category[1], "May", new Integer(58));
		model.setValue(category[1], "Jun", new Integer(75));

		model.setValue(category[2], "Jan", new Integer(40));
		model.setValue(category[2], "Feb", new Integer(55));
		model.setValue(category[2], "Mar", new Integer(65));
		model.setValue(category[2], "Apr", new Integer(57));
		model.setValue(category[2], "May", new Integer(63));
		model.setValue(category[2], "Jun", new Integer(68));
		return model;
	}
}
ChartColors.java
package demo.chart;

import java.awt.Color;

import org.apache.commons.lang.StringUtils;

public class ChartColors {
	//main colors
	public static Color COLOR_1 = new Color(0x3E454C);
	public static Color COLOR_2 = new Color(0x2185C5);
	public static Color COLOR_3 = new Color(0x7ECEFD);
	public static Color COLOR_4 = new Color(0xFFF6E5);
	public static Color COLOR_5 = new Color(0xFF7F66);
	//additional colors
	public static Color COLOR_6 = new Color(0x98D9FF);
	public static Color COLOR_7 = new Color(0x4689B1);
	public static Color COLOR_8 = new Color(0xB17C35);
	public static Color COLOR_9 = new Color(0xFDC77E);
	
	public static String toHtmlColor(Color color) {
		return "#" + toHexColor(color);
	}

	public static String toHexColor(Color color) {
		return StringUtils.leftPad(Integer.toHexString(color.getRGB() & 0xFFFFFF), 6, '0');
	}
	
}