diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java index cd0f851adfdd9c47e25206420b9c425678d5a98f..10792c3ab62f99c436015c4acb13e52cc9e14774 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java @@ -49,6 +49,7 @@ import com.xeiam.xchart.demo.charts.date.DateChart04; import com.xeiam.xchart.demo.charts.date.DateChart05; import com.xeiam.xchart.demo.charts.date.DateChart06; import com.xeiam.xchart.demo.charts.date.DateChart07; +import com.xeiam.xchart.demo.charts.date.DateChart08; import com.xeiam.xchart.demo.charts.line.LineChart01; import com.xeiam.xchart.demo.charts.line.LineChart02; import com.xeiam.xchart.demo.charts.line.LineChart03; @@ -303,6 +304,9 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart07 - Year Scale", new DateChart07().getChart())); category.add(defaultMutableTreeNode); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart08 - Rotated Labels", new DateChart08().getChart())); + category.add(defaultMutableTreeNode); + // Real-time category category = new DefaultMutableTreeNode("Real-time Charts"); top.add(category); diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart08.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart08.java new file mode 100644 index 0000000000000000000000000000000000000000..fbb6c8b85d20c9aa12f8fa964449f7eee00f49fc --- /dev/null +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart08.java @@ -0,0 +1,78 @@ +/** + * Copyright 2011 - 2015 Xeiam LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.xeiam.xchart.demo.charts.date; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + +import com.xeiam.xchart.Chart; +import com.xeiam.xchart.ChartBuilder; +import com.xeiam.xchart.StyleManager.TextAlignment; +import com.xeiam.xchart.SwingWrapper; +import com.xeiam.xchart.demo.charts.ExampleChart; + +/** + * Year scale + */ +public class DateChart08 implements ExampleChart { + + public static void main(String[] args) { + + ExampleChart exampleChart = new DateChart08(); + Chart chart = exampleChart.getChart(); + new SwingWrapper(chart).displayChart(); + } + + @Override + public Chart getChart() { + + // Create Chart + Chart chart = new ChartBuilder().width(800).height(600).title("Year Scale").build(); + chart.getStyleManager().setLegendVisible(false); + chart.getStyleManager().setXAxisLabelRotation(45); + chart.getStyleManager().setYAxisLabelRotation(90); + chart.getStyleManager().setXAxisLabelAlignment(TextAlignment.Right); + chart.getStyleManager().setDatePattern("yyyy-MM-dd"); + + // generate data + List<Date> xData = new ArrayList<Date>(); + List<Double> yData = new ArrayList<Double>(); + + Random random = new Random(); + + DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = null; + for (int i = 1; i <= 14; i++) { + try { + date = sdf.parse("" + (2001 + i) + "-" + random.nextInt(12) + "-" + random.nextInt(28)); + } catch (ParseException e) { + e.printStackTrace(); + } + xData.add(date); + yData.add(Math.random() * i); + } + + chart.addSeries("blah", xData, yData); + + return chart; + + } +} diff --git a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java index 2f8fb741d6ca6000b11cfd9e51590e52a0be59d8..6c2d3f12d68c7eb35b49209fa9bfd2a052011e20 100644 --- a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java +++ b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java @@ -123,6 +123,8 @@ public class StyleManager { private double axisTickSpacePercentage; private TextAlignment xAxisLabelAlignment = TextAlignment.Centre; private TextAlignment yAxisLabelAlignment = TextAlignment.Left; + private int xAxisLabelRotation = 0; + private int yAxisLabelRotation = 0; // Chart Plot Area /////////////////////////////// private boolean isPlotGridLinesVisible; @@ -906,6 +908,26 @@ public class StyleManager { this.yAxisLabelAlignment = yAxisLabelAlignment; } + public int getXAxisLabelRotation() { + + return xAxisLabelRotation; + } + + public void setXAxisLabelRotation(int xAxisLabelRotation) { + + this.xAxisLabelRotation = xAxisLabelRotation; + } + + public int getYAxisLabelRotation() { + + return yAxisLabelRotation; + } + + public void setYAxisLabelRotation(int yAxisLabelRotation) { + + this.yAxisLabelRotation = yAxisLabelRotation; + } + // Chart Plot Area /////////////////////////////// /** 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 bfea7d59239c4db7c87ec2fbc241d818848f4969..1de853d6838ba34814831ad40fe80fbc1e564d6f 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 @@ -16,9 +16,13 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; +import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; +import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; +import java.text.SimpleDateFormat; +import java.util.Date; import com.xeiam.xchart.StyleManager.LegendPosition; @@ -143,8 +147,13 @@ public class Axis implements ChartPart { // Axis tick labels double axisTickLabelsHeight = 0.0; if (getChartPainter().getStyleManager().isXAxisTicksVisible()) { - TextLayout textLayout = new TextLayout("0", getChartPainter().getStyleManager().getAxisTickLabelsFont(), new FontRenderContext(null, true, false)); - Rectangle2D rectangle = textLayout.getBounds(); + String tickLabel = getChartPainter().getAxisPair().getXAxis().getAxisType().equals(AxisType.Date) ? + new SimpleDateFormat(getChartPainter().getStyleManager().getDatePattern()).format(new Date()) : "0"; + TextLayout textLayout = new TextLayout(tickLabel, getChartPainter().getStyleManager().getAxisTickLabelsFont(), new FontRenderContext(null, true, false)); + AffineTransform rot = getChartPainter().getStyleManager().getXAxisLabelRotation() == 0 ? null : + AffineTransform.getRotateInstance(-Math.toRadians(getChartPainter().getStyleManager().getXAxisLabelRotation())); + Shape shape = textLayout.getOutline(rot); + Rectangle2D rectangle = shape.getBounds(); axisTickLabelsHeight = rectangle.getHeight() + getChartPainter().getStyleManager().getAxisTickPadding() + getChartPainter().getStyleManager().getAxisTickMarkLength(); } return titleHeight + axisTickLabelsHeight; diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java index a6048547eae1d3d8953567024c4ff9a9257bc222..c3c0fa2002376cb504be1724564928b6e728a118 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java @@ -88,8 +88,10 @@ public class AxisTickLabels implements ChartPart { for (Double tickLocation : axisLabelTextLayouts.keySet()) { TextLayout axisLabelTextLayout = axisLabelTextLayouts.get(tickLocation); - Rectangle2D tickLabelBounds = axisLabelTextLayout.getBounds(); - Shape shape = axisLabelTextLayout.getOutline(null); + AffineTransform rot = getChartPainter().getStyleManager().getYAxisLabelRotation() == 0 ? null : + AffineTransform.getRotateInstance(-Math.toRadians(getChartPainter().getStyleManager().getYAxisLabelRotation())); + Shape shape = axisLabelTextLayout.getOutline(rot); + Rectangle2D tickLabelBounds = shape.getBounds(); double flippedTickLocation = yOffset + height - tickLocation; @@ -142,7 +144,9 @@ public class AxisTickLabels implements ChartPart { TextLayout textLayout = new TextLayout(tickLabel, getChartPainter().getStyleManager().getAxisTickLabelsFont(), frc); // Shape shape = v.getOutline(); - Shape shape = textLayout.getOutline(null); + AffineTransform rot = getChartPainter().getStyleManager().getXAxisLabelRotation() == 0 ? null : + AffineTransform.getRotateInstance(-Math.toRadians(getChartPainter().getStyleManager().getXAxisLabelRotation())); + Shape shape = textLayout.getOutline(rot); Rectangle2D tickLabelBounds = shape.getBounds2D(); AffineTransform orig = g.getTransform();