001package com.ganteater.ae.desktop.view; 002 003import java.awt.BorderLayout; 004import java.util.Properties; 005 006import org.jfree.chart.ChartFactory; 007import org.jfree.chart.ChartPanel; 008import org.jfree.chart.JFreeChart; 009import org.jfree.chart.axis.NumberAxis; 010import org.jfree.chart.labels.ItemLabelAnchor; 011import org.jfree.chart.labels.ItemLabelPosition; 012import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 013import org.jfree.chart.plot.CategoryPlot; 014import org.jfree.chart.plot.PlotOrientation; 015import org.jfree.chart.renderer.category.CategoryItemRenderer; 016import org.jfree.data.category.DefaultCategoryDataset; 017import org.jfree.ui.TextAnchor; 018 019import com.ganteater.ae.AEManager; 020import com.ganteater.ae.processor.annotation.CommandDescription; 021 022@CommandDescription("`BarChart` View Type example:\r\n" 023 + "```xml\r\n" 024 + "<View name=\"barView\" reuse=\"true\" type=\"BarChart\" title=\"Bar Chart\" xAxisLabel=\"x\" yAxisLabel=\"y\" /> \r\n" 025 + " <Rnd name=\"value\" symbols=\"3\" type=\"number\" /> \r\n" 026 + " <Out view=\"barView\" row=\"1\" column=\"$var{column}\" level=\"debug\">$var{value}</Out> \r\n" 027 + " <Rnd name=\"value\" symbols=\"3\" type=\"number\" /> \r\n" 028 + " <Out view=\"barView\" row=\"2\" column=\"$var{column}\" level=\"debug\">$var{value}</Out> \r\n" 029 + "</Loop> \r\n" 030 + "```") 031public class BarChart extends View { 032 private static final long serialVersionUID = 1L; 033 034 private DefaultCategoryDataset dataset; 035 private JFreeChart chart = null; 036 037 public void init(Properties params, AEManager manager) { 038 super.init(params, manager); 039 040 String title = params.getProperty("title"); 041 String xAxisLabel = params.getProperty("xAxisLabel"); 042 String yAxisLabel = params.getProperty("yAxisLabel"); 043 044 dataset = new DefaultCategoryDataset(); 045 chart = ChartFactory.createBarChart(title, xAxisLabel, yAxisLabel, dataset, PlotOrientation.VERTICAL, true, 046 true, true); 047 048 CategoryPlot plot = chart.getCategoryPlot(); 049 plot.setDomainGridlinesVisible(true); 050 051 CategoryItemRenderer renderer = ((CategoryPlot) chart.getPlot()).getRenderer(); 052 renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 053 renderer.setBaseItemLabelsVisible(true); 054 ItemLabelPosition position = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.TOP_CENTER); 055 renderer.setBasePositiveItemLabelPosition(position); 056 057 final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 058 rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 059 060 ChartPanel comp = new ChartPanel(chart); 061 add(comp, BorderLayout.CENTER); 062 } 063 064 @Override 065 public void out(Object data, Properties properties) { 066 if (data instanceof String) { 067 double value = Double.parseDouble((String) data); 068 Comparable<?> row = properties.getProperty("row"); 069 Comparable<?> column = properties.getProperty("column"); 070 071 CategoryPlot plot = chart.getCategoryPlot(); 072 final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 073 if (value != Math.ceil(value) && rangeAxis.getStandardTickUnits() == NumberAxis.createIntegerTickUnits()) { 074 rangeAxis.setStandardTickUnits(NumberAxis.createStandardTickUnits()); 075 } 076 077 dataset.addValue((int) value, row, column); 078 } 079 } 080}