diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example1.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example1.java index ea3bf42f814c66a92f0e08ddd8b330215eefd697..19e3cea8ee04eefc7318d0fc2a88d33455c70929 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example1.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example1.java @@ -74,7 +74,7 @@ public class Example1 implements ExampleChart { Chart chart = new Chart(800, 600); // Customize Chart - chart.setTitle("Example1"); + chart.setChartTitle("Example1"); chart.getStyleManager().setChartTitleVisible(false); chart.getStyleManager().setLegendVisible(false); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example10.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example10.java index a12b450b6927fe97e271500259be10bf5900f704..422ca389f82d3aef57364d28007b7e1e6e92edf0 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example10.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example10.java @@ -43,7 +43,7 @@ public class Example10 implements ExampleChart { Chart chart = new Chart(800, 600); // Customize Chart - chart.setTitle("Example10"); + chart.setChartTitle("Example10"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); chart.getStyleManager().setLegendVisible(false); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example2.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example2.java index 01474ec667b2e1608519dc1036ed9332033bcd6b..7eae57a537a23f09de76adaa82fd30b54890678c 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example2.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example2.java @@ -16,7 +16,7 @@ package com.xeiam.xchart.demo.charts; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; import com.xeiam.xchart.Chart; import com.xeiam.xchart.SwingWrapper; @@ -44,8 +44,8 @@ public class Example2 implements ExampleChart { // generates sine data int size = 30; - Collection<Number> xData1 = new ArrayList<Number>(); - Collection<Number> yData1 = new ArrayList<Number>(); + List<Number> xData1 = new ArrayList<Number>(); + List<Number> yData1 = new ArrayList<Number>(); for (int i = 0; i <= size; i++) { double radians = (Math.PI / (size / 2) * i); xData1.add(i - size / 2); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example3.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example3.java index fb0740aace5b148d848d5dfebb3601bd29a5311d..9b4659d3921bb221ab28468a67c42a56298e5d99 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example3.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example3.java @@ -53,7 +53,7 @@ public class Example3 implements ExampleChart { } // Customize Chart - chart.setTitle("Example3"); + chart.setChartTitle("Example3"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example4.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example4.java index 5884ae3498b245198553d50b86c14d4669233215..b73bb55a202f30376c9c02120b5a42fb9d4ec2a6 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example4.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example4.java @@ -65,10 +65,10 @@ public class Example4 implements ExampleChart { } // Customize Chart - chart.setTitle("Example4"); + chart.setChartTitle("Example4"); chart.setXAxisTitle("time of day"); chart.setYAxisTitle("gigawatts"); - chart.setTimezone(TimeZone.getTimeZone("UTC")); + chart.getValueFormatter().setTimezone(TimeZone.getTimeZone("UTC")); Series series = chart.addDateSeries("value", xData, yData); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example5.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example5.java index 5f90fba1ee2a367e5095b7e816042c22ae127ad0..7f8e95844f93e3477ee653bed065044a23693ae3 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example5.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example5.java @@ -39,7 +39,7 @@ public class Example5 implements ExampleChart { Chart chart = new Chart(800, 600); // Customize Chart - chart.setTitle("Example5"); + chart.setChartTitle("Example5"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example6.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example6.java index 0571a58c35f3a4cc7bb269c2b56ff27f2e40d73c..ef8b9e7326fc2be6ce876fa7888f8b1b89f80881 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example6.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example6.java @@ -39,7 +39,7 @@ public class Example6 implements ExampleChart { Chart chart = new Chart(800, 600); // Customize Chart - chart.setTitle("Example6"); + chart.setChartTitle("Example6"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example7.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example7.java index f995d3665b7f10cbcb9850a6e65dfbd7bd001fd9..0b006b1dd0897cad26b34921e61ae98e28ce6825 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example7.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example7.java @@ -43,7 +43,7 @@ public class Example7 implements ExampleChart { // Create Chart Chart chart = new Chart(800, 600); - chart.setTitle("Example7"); + chart.setChartTitle("Example7"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); chart.addSeries("y(x)", xData, yData); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example9.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example9.java index be243f17d30119cea3d9f315db698b76d130fa18..9d669ed86f96d55f49c132dc19b0df2fb122840f 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example9.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/Example9.java @@ -71,11 +71,11 @@ public class Example9 implements ExampleChart { } // Customize Chart - chart.setTitle("Sample Chart Extensive Cusomization"); + chart.setChartTitle("Sample Chart Extensive Cusomization"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); - chart.setForegroundColor(ChartColor.getAWTColor(ChartColor.GREY)); - chart.setGridLinesColor(new Color(255, 255, 255)); + chart.getStyleManager().setPlotBackgroundColor(ChartColor.getAWTColor(ChartColor.GREY)); + chart.getStyleManager().setPlotGridLinesColor(new Color(255, 255, 255)); chart.getStyleManager().setChartBackgroundColor(Color.WHITE); chart.getStyleManager().setLegendBackgroundColor(Color.PINK); chart.getStyleManager().setChartBordersColor(Color.GREEN); @@ -84,9 +84,9 @@ public class Example9 implements ExampleChart { chart.getStyleManager().setLegendFont(new Font(Font.SERIF, Font.PLAIN, 18)); chart.getStyleManager().setAxisTitleFont(new Font(Font.SANS_SERIF, Font.ITALIC, 18)); chart.getStyleManager().setAxisTicksFont(new Font(Font.SERIF, Font.PLAIN, 11)); - chart.setDateFormatter("dd-MMM"); - chart.setDecmialFormatter("#.000"); - chart.setLocale(Locale.GERMAN); + chart.getValueFormatter().setDatePattern("dd-MMM"); + chart.getValueFormatter().setNormalDecimalPattern("#.000"); + chart.getValueFormatter().setLocale(Locale.GERMAN); Series series = chart.addDateSeries("Fake Data", xData, yData); series.setLineColor(SeriesColor.BLUE); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/example/Example1.java b/xchart-demo/src/main/java/com/xeiam/xchart/example/Example1.java index 8ee1128d80dab9af7dcf087ee437d4a45d28397b..86154f306ce001ff3507d948fdbd1bfbde189a88 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/example/Example1.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/example/Example1.java @@ -31,7 +31,7 @@ public class Example1 { // Create Chart Chart chart = new Chart(500, 400); - chart.setTitle("Sample Chart"); + chart.setChartTitle("Sample Chart"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); chart.addSeries("y(x)", null, yData); diff --git a/xchart/src/main/java/com/xeiam/xchart/Chart.java b/xchart/src/main/java/com/xeiam/xchart/Chart.java index 20fd197177899c9ebb538c829b3b6b64ac807e4d..eea0356453aa4b4f0d05cb725ef0442e90c88c75 100644 --- a/xchart/src/main/java/com/xeiam/xchart/Chart.java +++ b/xchart/src/main/java/com/xeiam/xchart/Chart.java @@ -15,14 +15,11 @@ */ package com.xeiam.xchart; -import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.ArrayList; import java.util.Collection; import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; import com.xeiam.xchart.internal.chartpart.AxisPair; import com.xeiam.xchart.internal.chartpart.ChartTitle; @@ -30,6 +27,7 @@ import com.xeiam.xchart.internal.chartpart.Legend; import com.xeiam.xchart.internal.chartpart.Plot; import com.xeiam.xchart.style.Series; import com.xeiam.xchart.style.StyleManager; +import com.xeiam.xchart.style.ValueFormatter; import com.xeiam.xchart.style.theme.Theme; /** @@ -43,6 +41,7 @@ public class Chart { public int height; private StyleManager styleManager = new StyleManager(); + private ValueFormatter valueFormatter = new ValueFormatter(); // Chart Parts public ChartTitle chartTitle = new ChartTitle(this); @@ -71,7 +70,7 @@ public class Chart { public Chart(ChartBuilder chartBuilder) { this(chartBuilder.width, chartBuilder.height); - setTitle(chartBuilder.title); + setChartTitle(chartBuilder.title); setXAxisTitle(chartBuilder.xAxisTitle); setYAxisTitle(chartBuilder.yAxisTitle); styleManager.setLegendVisible(chartBuilder.isLegendVisible); @@ -219,7 +218,7 @@ public class Chart { * * @param title */ - public void setTitle(String title) { + public void setChartTitle(String title) { this.chartTitle.setText(title); } @@ -236,7 +235,7 @@ public class Chart { } else { styleManager.setxAxisTitleVisible(true); } - this.axisPair.xAxis.axisTitle.setText(title); + this.axisPair.xAxis.axisTitle.text = title; } /** @@ -251,81 +250,7 @@ public class Chart { } else { styleManager.setyAxisTitleVisible(true); } - this.axisPair.yAxis.axisTitle.setText(title); - } - - /** - * Set the chart foreground color - the part the series are drawn on - * - * @param color - */ - public void setForegroundColor(Color color) { - - this.plot.plotSurface.setForegroundColor(color); - } - - /** - * Set the chart grid lines color - * - * @param color - */ - public void setGridLinesColor(Color color) { - - this.plot.plotSurface.setGridLinesColor(color); - } - - /** - * Set the String formatter for Data x-axis - * - * @param pattern - the pattern describing the date and time format - */ - public void setDateFormatter(String pattern) { - - this.axisPair.xAxis.axisTick.datePattern = pattern; - } - - /** - * Set the decimal formatter for all tick labels - * - * @param pattern - the pattern describing the decimal format - */ - public void setDecmialFormatter(String pattern) { - - this.axisPair.xAxis.axisTick.normalDecimalPattern = pattern; - this.axisPair.yAxis.axisTick.normalDecimalPattern = pattern; - } - - /** - * Set the scientific notation formatter for all tick labels - * - * @param pattern - the pattern describing the scientific notation format - */ - public void setDecmialScientificFormatter(String pattern) { - - this.axisPair.xAxis.axisTick.scientificDecimalPattern = pattern; - this.axisPair.yAxis.axisTick.scientificDecimalPattern = pattern; - } - - /** - * Set the locale to use for rendering the chart - * - * @param locale - the locale to use when formatting Strings and dates for the axis tick labels - */ - public void setLocale(Locale locale) { - - this.axisPair.xAxis.axisTick.locale = locale; - this.axisPair.yAxis.axisTick.locale = locale; - } - - /** - * Set the timezone to use for formatting Date axis tick labels - * - * @param timezone the timezone to use when formatting date data - */ - public void setTimezone(TimeZone timezone) { - - this.axisPair.xAxis.axisTick.timezone = timezone; - this.axisPair.yAxis.axisTick.timezone = timezone; + this.axisPair.yAxis.axisTitle.text = title; } /** @@ -349,4 +274,14 @@ public class Chart { } + /** + * Gets the Chart's value formatter, which can be used to customize the formatting of numbers and dates + * + * @return + */ + public ValueFormatter getValueFormatter() { + + return valueFormatter; + } + } diff --git a/xchart/src/main/java/com/xeiam/xchart/QuickChart.java b/xchart/src/main/java/com/xeiam/xchart/QuickChart.java index 4ac80f6cc79fee6db1ee29cba49aa533fe9feb37..2d4249b0b29576b3fbef74b03351ae40b56b0013 100644 --- a/xchart/src/main/java/com/xeiam/xchart/QuickChart.java +++ b/xchart/src/main/java/com/xeiam/xchart/QuickChart.java @@ -75,7 +75,7 @@ public final class QuickChart { Chart chart = new Chart(WIDTH, HEIGHT); // Customize Chart - chart.setTitle(chartTitle); + chart.setChartTitle(chartTitle); chart.setXAxisTitle(xTitle); chart.setYAxisTitle(yTitle); @@ -111,7 +111,7 @@ public final class QuickChart { Chart chart = new Chart(WIDTH, HEIGHT); // Customize Chart - chart.setTitle(chartTitle); + chart.setChartTitle(chartTitle); chart.setXAxisTitle(xTitle); chart.setYAxisTitle(yTitle); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java index e3bcc2c22932e4274d1769cc93ba5a0832e9a730..e40618ea14f95bc4c1d2e58f1bceed67d2d96ac3 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java @@ -142,7 +142,7 @@ public class Axis implements IChartPart { // Axis title double titleHeight = 0.0; if (axisPair.chart.getStyleManager().isxAxisTitleVisible()) { - TextLayout textLayout = new TextLayout(axisTitle.getText(), axisTick.axis.axisPair.chart.getStyleManager().getAxisTitleFont(), new FontRenderContext(null, true, false)); + TextLayout textLayout = new TextLayout(axisTitle.text, axisTick.axis.axisPair.chart.getStyleManager().getAxisTitleFont(), new FontRenderContext(null, true, false)); Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0); titleHeight = rectangle.getHeight() + axisTick.axis.axisPair.chart.getStyleManager().getAxisTitlePadding(); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java index 20207578887045c8bb6356b22614da439f1e4cd5..9ecf6fc4e7ba5db6bff907c2c753802e90202552 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java @@ -26,7 +26,6 @@ import java.util.TimeZone; import com.xeiam.xchart.internal.chartpart.Axis.AxisType; import com.xeiam.xchart.internal.chartpart.Axis.Direction; import com.xeiam.xchart.internal.interfaces.IChartPart; -import com.xeiam.xchart.internal.misc.AxisValueFormatterUtil; /** * An axis tick @@ -75,7 +74,8 @@ public class AxisTick implements IChartPart { /** * Constructor * - * @param axis the axis + * @param axis + * @param isVisible */ protected AxisTick(Axis axis, boolean isVisible) { @@ -83,7 +83,6 @@ public class AxisTick implements IChartPart { this.isVisible = isVisible; axisTickLabels = new AxisTickLabels(this); axisTickMarks = new AxisTickMarks(this); - } @Override @@ -255,11 +254,11 @@ public class AxisTick implements IChartPart { if (axis.axisType == AxisType.NUMBER) { - return AxisValueFormatterUtil.formatNumber(value, normalDecimalPattern, scientificDecimalPattern, locale); + return axis.axisPair.chart.getValueFormatter().formatNumber(value); } else { - return AxisValueFormatterUtil.formatDateValue(value, axis.min, axis.max, datePattern, locale, timezone); + return axis.axisPair.chart.getValueFormatter().formatDateValue(value, axis.min, axis.max); } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java index 1acf0741e4d737b0e08b0fdb4d7fed6043ba64a6..4eb497e3c3c9d8e954fc8b2d1624cd45cf9d7c2e 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java @@ -76,11 +76,13 @@ public class AxisTickMarks implements IChartPart { + (int) (axisTick.axis.getPaintZone().getHeight() - tickLocation)); } + // Line if (axisTick.axis.axisPair.chart.getStyleManager().isAxisTicksLineVisible()) { g.drawLine(xOffset + axisTick.axis.axisPair.chart.getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + axisTick.axis.axisPair.chart.getStyleManager().getAxisTickMarkLength(), yOffset + (int) axisTick.axis.getPaintZone().getHeight()); } + // bounds bounds = new Rectangle(xOffset, yOffset, axisTick.axis.axisPair.chart.getStyleManager().getAxisTickMarkLength(), (int) axisTick.axis.getPaintZone().getHeight()); // g.setColor(Color.yellow); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java index fa0391a6a4c9a2bcc071e5e3edb1429ad7f2ab7f..95d4dc693404a7b09e4e3d0db3ab81f05fe02d06 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java @@ -32,7 +32,7 @@ public class AxisTitle implements IChartPart { private final Axis axis; /** the title text */ - protected String text = ""; // default to "" + public String text = ""; // default to "" /** the bounds */ private Rectangle bounds; @@ -47,16 +47,6 @@ public class AxisTitle implements IChartPart { this.axis = axis; } - protected String getText() { - - return text; - } - - public void setText(String text) { - - this.text = text; - } - @Override public Rectangle getBounds() { diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java index 654db3bd9f03a776c01b47d71ad70d32d77aad37..3a15ac5a3e8a641a765381ad48daf63d6051dc94 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java @@ -47,6 +47,11 @@ public class ChartTitle implements IChartPart { this.chart = chart; } + /** + * set the chart title's text + * + * @param text + */ public void setText(String text) { if (text.trim().equalsIgnoreCase("")) { diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java index b9749e419342c49ece0f5258cf67901e1dba91e5..0d21bb9c32549810f4bf7314c49fabb28278cf0c 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java @@ -18,6 +18,7 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.Stroke; import java.math.BigDecimal; import java.util.Collection; import java.util.Date; @@ -36,6 +37,8 @@ public class PlotContent implements IChartPart { /** parent */ private Plot plot; + Stroke errorBarStroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); + /** * Constructor * @@ -145,8 +148,8 @@ public class PlotContent implements IChartPart { // paint errorbar if (errorBars != null) { - g.setColor(plot.chart.getStyleManager().getChartBordersColor()); - g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g.setColor(plot.chart.getStyleManager().getErrorBarsColor()); + g.setStroke(errorBarStroke); int bottom = (int) (-1 * bounds.getHeight() * eb / (yMax.subtract(yMin).doubleValue())); int top = (int) (bounds.getHeight() * eb / (yMax.subtract(yMin).doubleValue())); g.drawLine(xOffset, yOffset + bottom, xOffset, yOffset + top); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java index 146f766b765f0aa0d71fc7f23e7b1c692116daa0..d0ab69f610a9856f3851bbc10e41b44cba107f0f 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java @@ -16,13 +16,11 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.BasicStroke; -import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.util.List; import com.xeiam.xchart.internal.interfaces.IChartPart; -import com.xeiam.xchart.style.ChartColor; /** * @author timmolter @@ -32,14 +30,8 @@ public class PlotSurface implements IChartPart { /** parent */ private Plot plot; - /** the gridLines Color */ - private Color gridLinesColor; - - /** the background color */ - private Color foregroundColor; - /** the line style */ - private BasicStroke stroke; + private BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 3.0f }, 0.0f); /** * Constructor @@ -49,9 +41,6 @@ public class PlotSurface implements IChartPart { protected PlotSurface(Plot plot) { this.plot = plot; - gridLinesColor = ChartColor.getAWTColor(ChartColor.GREY); // default gridLines color - foregroundColor = ChartColor.getAWTColor(ChartColor.LIGHT_GREY); // default foreground Color color - stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 3.0f }, 0.0f); } @Override @@ -65,9 +54,9 @@ public class PlotSurface implements IChartPart { Rectangle bounds = plot.getBounds(); - // paint foreground + // paint plot background Rectangle backgroundRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight()); - g.setColor(foregroundColor); + g.setColor(plot.chart.getStyleManager().getPlotBackgroundColor()); g.fill(backgroundRectangle); Rectangle borderRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight()); g.setColor(plot.chart.getStyleManager().getChartBordersColor()); @@ -75,13 +64,14 @@ public class PlotSurface implements IChartPart { // paint grid lines if (plot.chart.getStyleManager().isPlotGridLinesVisible()) { + // horizontal List<Integer> yAxisTickLocations = plot.chart.axisPair.yAxis.axisTick.tickLocations; for (int i = 0; i < yAxisTickLocations.size(); i++) { int tickLocation = yAxisTickLocations.get(i); - g.setColor(gridLinesColor); + g.setColor(plot.chart.getStyleManager().getPlotGridLinesColor()); g.setStroke(stroke); // System.out.println("bounds.getY()= " + bounds.getY()); g.drawLine((int) bounds.getX(), (int) (bounds.getY() + bounds.getHeight() - tickLocation), (int) (bounds.getX() + bounds.getWidth() - 2), @@ -94,7 +84,7 @@ public class PlotSurface implements IChartPart { int tickLocation = xAxisTickLocations.get(i); - g.setColor(gridLinesColor); + g.setColor(plot.chart.getStyleManager().getPlotGridLinesColor()); g.setStroke(stroke); g.drawLine((int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + 1), (int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + bounds.getHeight() - 1)); @@ -102,20 +92,4 @@ public class PlotSurface implements IChartPart { } } - /** - * @param gridLinesColor the gridLinesColor to set - */ - public void setGridLinesColor(Color gridLinesColor) { - - this.gridLinesColor = gridLinesColor; - } - - /** - * @param foregroundColor the foregroundColor to set - */ - public void setForegroundColor(Color foregroundColor) { - - this.foregroundColor = foregroundColor; - } - } diff --git a/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java b/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java index 6988a7446a3650b761706101d1f94a5fd8053b49..cccfe42482d4875f45f4c311f4e81cc6ac974d99 100644 --- a/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java +++ b/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java @@ -66,6 +66,11 @@ public class StyleManager { // Chart Plot Area /////////////////////////////// private boolean isPlotGridLinesVisible; + private Color plotBackgroundColor; + private Color plotGridLinesColor; + + // Error Bars /////////////////////////////// + private Color errorBarsColor; /** * Constructor @@ -108,6 +113,11 @@ public class StyleManager { // Chart Plot Area /////////////////////////////// isPlotGridLinesVisible = theme.isPlotGridLinesVisible(); + plotBackgroundColor = theme.getPlotBackgroundColor(); + plotGridLinesColor = theme.getPlotGridLinesColor(); + + // Error Bars /////////////////////////////// + errorBarsColor = theme.getErrorBarsColor(); } /** @@ -486,4 +496,51 @@ public class StyleManager { return isPlotGridLinesVisible; } + + /** + * set the plot area's background color + * + * @param plotBackgroundColor + */ + public void setPlotBackgroundColor(Color plotBackgroundColor) { + + this.plotBackgroundColor = plotBackgroundColor; + } + + public Color getPlotBackgroundColor() { + + return plotBackgroundColor; + } + + /** + * set the plot area's grid lines color + * + * @param plotGridLinesColor + */ + public void setPlotGridLinesColor(Color plotGridLinesColor) { + + this.plotGridLinesColor = plotGridLinesColor; + } + + public Color getPlotGridLinesColor() { + + return plotGridLinesColor; + } + + // Error Bars /////////////////////////////// + + /** + * Sets the color of the error bars + * + * @param errorBarsColor + */ + public void setErrorBarsColor(Color errorBarsColor) { + + this.errorBarsColor = errorBarsColor; + } + + public Color getErrorBarsColor() { + + return errorBarsColor; + } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/misc/AxisValueFormatterUtil.java b/xchart/src/main/java/com/xeiam/xchart/style/ValueFormatter.java similarity index 52% rename from xchart/src/main/java/com/xeiam/xchart/internal/misc/AxisValueFormatterUtil.java rename to xchart/src/main/java/com/xeiam/xchart/style/ValueFormatter.java index 087c1284ab5052f431ffe505ba78c715c97f9354..19b15d428754e720e12c4e24dd059c3968ea84fd 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/misc/AxisValueFormatterUtil.java +++ b/xchart/src/main/java/com/xeiam/xchart/style/ValueFormatter.java @@ -19,7 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package com.xeiam.xchart.internal.misc; +package com.xeiam.xchart.style; import java.math.BigDecimal; import java.text.DecimalFormat; @@ -32,13 +32,13 @@ import java.util.concurrent.TimeUnit; /** * @author timmolter */ -public class AxisValueFormatterUtil { +public class ValueFormatter { - private static final String NORMAL_DECIMAL_PATTERN = "#.####"; - private static final String SCIENTIFIC_DECIMAL_PATTERN = "0.##E0"; - private static final String DATE_PATTERN = "HHmmss"; - private static final Locale LOCALE = Locale.getDefault(); - private static final TimeZone TIMEZONE = TimeZone.getDefault(); + private String normalDecimalPattern; + private String scientificDecimalPattern; + private String datePattern; + private Locale locale; + private TimeZone timezone; private static final long SEC_SCALE = TimeUnit.SECONDS.toMillis(1L); private static final long MIN_SCALE = TimeUnit.MINUTES.toMillis(1L); @@ -51,35 +51,37 @@ public class AxisValueFormatterUtil { /** * Constructor */ - private AxisValueFormatterUtil() { + public ValueFormatter() { + normalDecimalPattern = "#.####"; + scientificDecimalPattern = "0.##E0"; + datePattern = "HHmmss"; + locale = Locale.getDefault(); + timezone = TimeZone.getDefault(); } /** * Format a number value, if the override patterns are null, it uses defaults * * @param value - * @param normalDecimalPatternOverride - * @param scientificDecimalPatternOverride - * @param localeOverride - * @return the formatted number as a String + * @return */ - public static String formatNumber(BigDecimal value, String normalDecimalPatternOverride, String scientificDecimalPatternOverride, Locale localeOverride) { + public String formatNumber(BigDecimal value) { - NumberFormat numberFormat = NumberFormat.getNumberInstance(localeOverride == null ? LOCALE : localeOverride); + NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); BigDecimal absoluteValue = value.abs(); if (absoluteValue.compareTo(new BigDecimal("10000.000001")) == -1 && absoluteValue.compareTo(new BigDecimal(".0009999999")) == 1 || BigDecimal.ZERO.compareTo(value) == 0) { DecimalFormat normalFormat = (DecimalFormat) numberFormat; - normalFormat.applyPattern(normalDecimalPatternOverride == null ? NORMAL_DECIMAL_PATTERN : normalDecimalPatternOverride); + normalFormat.applyPattern(normalDecimalPattern); return normalFormat.format(value); } else { DecimalFormat scientificFormat = (DecimalFormat) numberFormat; - scientificFormat.applyPattern(scientificDecimalPatternOverride == null ? SCIENTIFIC_DECIMAL_PATTERN : scientificDecimalPatternOverride); + scientificFormat.applyPattern(scientificDecimalPattern); return scientificFormat.format(value); } @@ -92,42 +94,86 @@ public class AxisValueFormatterUtil { * @param value * @param min * @param max - * @param datePatternOverride - * @param localeOverride - * @return the formatted date value as a String + * @return */ - public static String formatDateValue(BigDecimal value, BigDecimal min, BigDecimal max, String datePatternOverride, Locale localeOverride, TimeZone timeZoneOverride) { - - // intelligently set datepattern if none is given - String datePattern = datePatternOverride; - if (datePatternOverride == null) { - datePattern = DATE_PATTERN; - long diff = max.subtract(min).longValue(); - - if (diff < SEC_SCALE) { - datePattern = "ss:S"; - } else if (diff < MIN_SCALE) { - datePattern = "mm:ss"; - } else if (diff < HOUR_SCALE) { - datePattern = "HH:mm"; - } else if (diff < DAY_SCALE) { - datePattern = "EEE HH:mm"; - } else if (diff < WEEK_SCALE) { - datePattern = "EEE"; - } else if (diff < MONTH_SCALE) { - datePattern = "MMM-dd"; - } else if (diff < YEAR_SCALE) { - datePattern = "yyyy:MMM"; - } else { - datePattern = "yyyy"; - } - + public String formatDateValue(BigDecimal value, BigDecimal min, BigDecimal max) { + + // intelligently set date pattern if none is given + long diff = max.subtract(min).longValue(); + + if (diff < SEC_SCALE) { + datePattern = "ss:S"; + } else if (diff < MIN_SCALE) { + datePattern = "mm:ss"; + } else if (diff < HOUR_SCALE) { + datePattern = "HH:mm"; + } else if (diff < DAY_SCALE) { + datePattern = "EEE HH:mm"; + } else if (diff < WEEK_SCALE) { + datePattern = "EEE"; + } else if (diff < MONTH_SCALE) { + datePattern = "MMM-dd"; + } else if (diff < YEAR_SCALE) { + datePattern = "yyyy:MMM"; + } else { + datePattern = "yyyy"; } - SimpleDateFormat simpleDateformat = new SimpleDateFormat(datePattern, localeOverride == null ? LOCALE : localeOverride); - simpleDateformat.setTimeZone(timeZoneOverride == null ? TIMEZONE : timeZoneOverride); + SimpleDateFormat simpleDateformat = new SimpleDateFormat(datePattern, locale); + simpleDateformat.setTimeZone(timezone); simpleDateformat.applyPattern(datePattern); return simpleDateformat.format(value.longValueExact()); } + + /** + * Set the decimal formatter for all tick labels + * + * @param pattern - the pattern describing the decimal format + */ + public void setNormalDecimalPattern(String normalDecimalPattern) { + + this.normalDecimalPattern = normalDecimalPattern; + } + + /** + * Set the scientific notation formatter for all tick labels + * + * @param pattern - the pattern describing the scientific notation format + */ + public void setScientificDecimalPattern(String scientificDecimalPattern) { + + this.scientificDecimalPattern = scientificDecimalPattern; + } + + /** + * Set the String formatter for Data x-axis + * + * @param pattern - the pattern describing the date and time format + */ + public void setDatePattern(String datePattern) { + + this.datePattern = datePattern; + } + + /** + * Set the locale to use for rendering the chart + * + * @param locale - the locale to use when formatting Strings and dates for the axis tick labels + */ + public void setLocale(Locale locale) { + + this.locale = locale; + } + + /** + * Set the timezone to use for formatting Date axis tick labels + * + * @param timezone the timezone to use when formatting date data + */ + public void setTimezone(TimeZone timezone) { + + this.timezone = timezone; + } + } diff --git a/xchart/src/main/java/com/xeiam/xchart/style/theme/Theme.java b/xchart/src/main/java/com/xeiam/xchart/style/theme/Theme.java index b31cefa25b2e73696dbeffb635659ce37adcfd47..0cac20f37ef42b4c27590bb3bfb67b52a49ca193 100644 --- a/xchart/src/main/java/com/xeiam/xchart/style/theme/Theme.java +++ b/xchart/src/main/java/com/xeiam/xchart/style/theme/Theme.java @@ -83,4 +83,12 @@ public interface Theme { public boolean isPlotGridLinesVisible(); + public Color getPlotBackgroundColor(); + + public Color getPlotGridLinesColor(); + + // Error Bars /////////////////////////////// + + public Color getErrorBarsColor(); + } diff --git a/xchart/src/main/java/com/xeiam/xchart/style/theme/XChartTheme.java b/xchart/src/main/java/com/xeiam/xchart/style/theme/XChartTheme.java index 86d69e425bfa4fdd2d8fc65366083000b178ac3e..c8694e8b28c839bed9b57b1bb59f88e3b2408914 100644 --- a/xchart/src/main/java/com/xeiam/xchart/style/theme/XChartTheme.java +++ b/xchart/src/main/java/com/xeiam/xchart/style/theme/XChartTheme.java @@ -172,4 +172,25 @@ public class XChartTheme implements Theme { return true; } + + @Override + public Color getPlotBackgroundColor() { + + return ChartColor.getAWTColor(ChartColor.LIGHT_GREY); + } + + @Override + public Color getPlotGridLinesColor() { + + return ChartColor.getAWTColor(ChartColor.GREY); + } + + // Error Bars /////////////////////////////// + + @Override + public Color getErrorBarsColor() { + + return ChartColor.getAWTColor(ChartColor.DARK_GREY); + } + } diff --git a/xchart/src/test/java/com/xeiam/xchart/ValueFormatTest.java b/xchart/src/test/java/com/xeiam/xchart/ValueFormatterTest.java similarity index 68% rename from xchart/src/test/java/com/xeiam/xchart/ValueFormatTest.java rename to xchart/src/test/java/com/xeiam/xchart/ValueFormatterTest.java index 25b13ddb10accdfd63b7a04e9af1fab76bda6c16..3c266f11e344905fd8f9c4c8b3aab6b96c422594 100644 --- a/xchart/src/test/java/com/xeiam/xchart/ValueFormatTest.java +++ b/xchart/src/test/java/com/xeiam/xchart/ValueFormatterTest.java @@ -30,68 +30,71 @@ import java.util.TimeZone; import org.junit.Test; -import com.xeiam.xchart.internal.misc.AxisValueFormatterUtil; +import com.xeiam.xchart.style.ValueFormatter; /** * @author timmolter */ -public class ValueFormatTest { +public class ValueFormatterTest { private final Locale locale = Locale.US; @Test public void testNumberFormatting() { + ValueFormatter axisTickLabelFormatter = new ValueFormatter(); + // big + axisTickLabelFormatter.setLocale(locale); BigDecimal value = new BigDecimal("1"); - String stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + String stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("1")); value = new BigDecimal(1000L); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("1000")); value = new BigDecimal("9999"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("9999")); value = new BigDecimal(20000L); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("2E4")); value = new BigDecimal("200.23"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("200.23")); // small value = new BigDecimal("0.01"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0.01")); value = new BigDecimal("0.001"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0.001")); value = new BigDecimal("0.0012"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0.0012")); value = new BigDecimal("0.0001"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("1E-4")); value = new BigDecimal(".00012"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("1.2E-4")); value = new BigDecimal("0.0"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0")); value = new BigDecimal("0"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, locale); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0")); // other case @@ -107,21 +110,24 @@ public class ValueFormatTest { // assertThat(stringValue, equalTo("0.01")); // non-default + axisTickLabelFormatter.setLocale(Locale.GERMANY); value = new BigDecimal("0.01"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, Locale.GERMANY); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("0,01")); value = new BigDecimal("200.23"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, null, Locale.GERMANY); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("200,23")); + axisTickLabelFormatter.setNormalDecimalPattern("#.#"); value = new BigDecimal("200.23"); - stringValue = AxisValueFormatterUtil.formatNumber(value, "#.#", null, Locale.GERMANY); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("200,2")); + axisTickLabelFormatter.setScientificDecimalPattern("0.#E0"); value = new BigDecimal("2009764.23"); - stringValue = AxisValueFormatterUtil.formatNumber(value, null, "0.#E0", Locale.GERMANY); + stringValue = axisTickLabelFormatter.formatNumber(value); assertThat(stringValue, equalTo("2E6")); } @@ -129,62 +135,67 @@ public class ValueFormatTest { @Test public void testDateFormatting() { + ValueFormatter axisTickLabelFormatter = new ValueFormatter(); + TimeZone timeZone = TimeZone.getTimeZone("UTC"); + axisTickLabelFormatter.setLocale(locale); + axisTickLabelFormatter.setTimezone(timeZone); + // ms BigDecimal value = new BigDecimal(1358108105531L); BigDecimal min = new BigDecimal(1358108105100L); BigDecimal max = new BigDecimal(1358108105900L); - String stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + String stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("05:531")); // sec value = new BigDecimal(1358108105000L); min = new BigDecimal(1358108101000L); max = new BigDecimal(1358108109000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("15:05")); // min value = new BigDecimal(1358111750000L); min = new BigDecimal(1358111690000L); max = new BigDecimal(1358111870000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("21:15")); // hour value = new BigDecimal(1358111870000L); min = new BigDecimal(1358101070000L); max = new BigDecimal(1358115470000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("Sun 21:17")); // day value = new BigDecimal(1358112317000L); min = new BigDecimal(1357939517000L); max = new BigDecimal(1358285117000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("Sun")); // week value = new BigDecimal(1358112317000L); min = new BigDecimal(1357075517000L); max = new BigDecimal(1359149117000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("Jan-13")); // month value = new BigDecimal(1358112838000L); min = new BigDecimal(1354397638000L); max = new BigDecimal(1361223238000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("2013:Jan")); // year value = new BigDecimal(1358113402000L); min = new BigDecimal(1263419002000L); max = new BigDecimal(1421185402000L); - stringValue = AxisValueFormatterUtil.formatDateValue(value, min, max, null, locale, timeZone); + stringValue = axisTickLabelFormatter.formatDateValue(value, min, max); assertThat(stringValue, equalTo("2013")); }