/* * Licensed Materials - Property of Perforce Software, Inc. * © Copyright Perforce Software, Inc. 2014, 2021 * © Copyright IBM Corp. 2009, 2014 * © Copyright ILOG 1996, 2009 * All Rights Reserved. * * Note to U.S. Government Users Restricted Rights: * The Software and Documentation were developed at private expense and * are "Commercial Items" as that term is defined at 48 CFR 2.101, * consisting of "Commercial Computer Software" and * "Commercial Computer Software Documentation", as such terms are * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4, * as applicable. */ import java.awt.Color; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import javax.swing.JFrame; import javax.swing.SwingUtilities; import com.ibm.icu.text.DateFormat; import com.ibm.icu.text.NumberFormat; import com.ibm.icu.text.SimpleDateFormat; import com.ibm.icu.util.ULocale; import ilog.views.chart.IlvChart; import ilog.views.chart.IlvChartRenderer; import ilog.views.chart.IlvScale; import ilog.views.chart.IlvStyle; import ilog.views.chart.IlvTimeUnit; import ilog.views.chart.IlvValueFormat; import ilog.views.chart.data.IlvDataSet; import ilog.views.chart.data.IlvDefaultDataSet; import ilog.views.chart.renderer.IlvSingleBarRenderer; import ilog.views.util.IlvProductUtil; import ilog.views.util.time.IlvCalendarFactory; /** * This example illustrates how to handle scales labels. */ public class ScaleLabelsExample { /** * An IlvValueFormat implementation to handle "time categories". A * CategoryTimeFormat is defined by: * <ul> * <li>a time origin, used to compute the date corresponding to an index. * <li>a time step, that defines the "unit" of the categories. * </ul> * This class format the scale labels such that a data point index is * converted into a date based on the CategoryTimeFormat origin and time step. * For example, if the origin is set to 01/01/2000 and the step is set to * <code>Calendar.YEAR</code>, then the index 0 is converted into 01/01/2000, * index 1 into 01/01/2001, index 2 into 01/01/2002, and so on. * <P> * Note: This class is particularly well suited for discrete time series (ie * time categories) when used in conjunction with a * <code>IlvDefaultStepsDefinition</code>. Indeed, a true time scale (that is * a scale using an <code>IlvTimeStepsDefinition</code> or upon which a time * step unit has been set) should only be used with continuous time series. */ private static class CategoryTimeFormat implements IlvValueFormat { private int step; private Calendar cal; private SimpleDateFormat fmt; private Date origin; /** * Initialize a new <code>CategoryTimeFormat</code>. * * @param origin * The origin of the categories. * @param step * The step of the categories. Should be a valid Calendar field * value. * @param unit * An optional time unit used to format the label. If null, the * default format is used. * @param locale * The locale for formatting. */ public CategoryTimeFormat(Date origin, int step, IlvTimeUnit unit, ULocale locale) { this.origin = origin; this.step = step; this.cal = IlvCalendarFactory.createInstance(locale); this.fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale); // set the format pattern, if specified. if (unit != null) { fmt = (SimpleDateFormat) fmt.clone(); fmt.applyPattern(unit.getFormatString(locale.toLocale())); } } /** * Formats the specified value into a string. */ Override public String formatValue(double value) { // compute the date corresponding to the given index. cal.setTime(origin); cal.add(step, (int) value); return fmt.format(cal.getTime()); } } public static void main(String[] args) { // This sample uses JViews Charts features. When deploying an // application that includes this code, you need to be in possession // of a Perforce JViews Charts Deployment license. IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Charts_Deployment); // the data series. final double[] yvalues = { 30, 80, 55, 91, 125, 53, 61, 98, 74, 61 }; // creates the chart data model. It contains only one series. IlvDataSet dataSet = new IlvDefaultDataSet("Series A", yvalues); // creates a chart (cartesian by default). The graphical representation // is polyline by default. final IlvChart chart = new IlvChart(); chart.setHeaderText("Average Precipitation"); // Attach the data model to the chart and render it as Bar. IlvChartRenderer r = new IlvSingleBarRenderer(); r.setStyles(new IlvStyle[] { new IlvStyle(new Color(249, 128, 114), new Color(183, 225, 204)) }); chart.addRenderer(r, dataSet); // modify the y-axis data range so that it starts at 0. chart.getYAxis(0).setDataMin(0); // -- Handle scales labels. IlvScale xscale = chart.getXScale(); // We set a CategoryTimeFormat on the x-scale to handle // the data point indices as "time category". Note that we do not use a // Time scale here because our values are discrete values (index) and not // continuous values. // The CategoryTimeFormat is initialized so that its origin is // January, 1st 1980 and its increment matches a year, using the // date format from the IlvTimeUnit.YEAR unit. // See above the documentation of the CategoryTimeFormat. Calendar cal = new GregorianCalendar(); cal.set(1980, 0, 1); xscale.setLabelFormat(new CategoryTimeFormat(cal.getTime(), Calendar.YEAR, IlvTimeUnit.YEAR, chart.getULocale())); // We also set a custom IlvValueFormat on the y-scale so that labels // are displayed as: value + " cm". IlvScale yscale = chart.getYScale(0); yscale.setLabelFormat(new IlvValueFormat() { private NumberFormat numformat = NumberFormat.getInstance(); Override public String formatValue(double value) { return numformat.format(value) + " cm"; } }); // The GUI. SwingUtilities.invokeLater(new Runnable() { Override public void run() { JFrame frame = new JFrame("Customizing Scales Labelling"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(chart); frame.setSize(400, 300); frame.setVisible(true); } }); } }