----------david.gilbert wrote:90 degrees is the only supported option in DateAxis and NumberAxis at present.onkar wrote:Would anyone tell me how to rotate tick labels at say 45 degree or for that matter at any angle ? Because setVerticalTickLabels makes them to rotate by 90 degree only !
Hy David, I have had the some problem, so i would like to share the overrided classes, i hope this can be useful for someone and i hope this will be supported in future jfreechart release.
---------------------------
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.text.DateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTick;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.Tick;
import org.jfree.data.time.Month;
import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.time.Year;
import org.jfree.text.TextUtilities;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
public final class DateDomainAxis extends DateAxis {
public DateDomainAxis(String label) {
super(label);
super.setVerticalTickLabels(true);
}
public final void setVerticalTickLabels(boolean flag) {
}
public final List refreshTicksHorizontal(Graphics2D g2,Rectangle2D dataArea,RectangleEdge edge) {
List result=new java.util.ArrayList();
Font tickLabelFont=getTickLabelFont();
g2.setFont(tickLabelFont);
if (isAutoTickUnitSelection()) {
selectAutoTickUnit(g2,dataArea,edge);
}
DateTickUnit unit=getTickUnit();
Date tickDate=calculateLowestVisibleTickValue(unit);
Date upperDate=getMaximumDate();
while (tickDate.before(upperDate)) {
if (!isHiddenValue(tickDate.getTime())) {
String tickLabel;
DateFormat formatter=getDateFormatOverride();
if (formatter!=null) {
tickLabel=formatter.format(tickDate);
} else {
tickLabel=this.getTickUnit().dateToString(tickDate);
}
double angle=0.0;
TextAnchor anchor=TextAnchor.CENTER_RIGHT;
TextAnchor rotationAnchor=TextAnchor.CENTER_RIGHT;
if (edge==RectangleEdge.TOP) {
angle=Math.PI/4.0;
} else {
angle=-Math.PI/4.0;
}
Tick tick=new DateTick(tickDate,tickLabel,anchor,rotationAnchor,angle);
result.add(tick);
tickDate=unit.addToDate(tickDate);
} else {
tickDate=unit.rollDate(tickDate);
continue;
}
switch (unit.getUnit()) {
case (DateTickUnit.MILLISECOND):
case (DateTickUnit.SECOND):
case (DateTickUnit.MINUTE):
case (DateTickUnit.HOUR):
case (DateTickUnit.DAY):
break;
case (DateTickUnit.MONTH):
tickDate=calculateDateForPosition(new Month(tickDate),this.getTickMarkPosition());
break;
case(DateTickUnit.YEAR):
tickDate=calculateDateForPosition(new Year(tickDate),this.getTickMarkPosition());
break;
default:
break;
}
}
return result;
}
public final List refreshTicksVertical(Graphics2D g2,Rectangle2D dataArea,RectangleEdge edge) {
List result=new java.util.ArrayList();
Font tickLabelFont=getTickLabelFont();
g2.setFont(tickLabelFont);
if (isAutoTickUnitSelection()) {
selectAutoTickUnit(g2,dataArea,edge);
}
DateTickUnit unit=getTickUnit();
Date tickDate=calculateLowestVisibleTickValue(unit);
Date upperDate=getMaximumDate();
while (tickDate.before(upperDate)) {
if (!isHiddenValue(tickDate.getTime())) {
String tickLabel;
DateFormat formatter=getDateFormatOverride();
if (formatter!=null) {
tickLabel=formatter.format(tickDate);
} else {
tickLabel=this.getTickUnit().dateToString(tickDate);
}
TextAnchor anchor=null;
TextAnchor rotationAnchor=null;
double angle=0.0;
if (edge==RectangleEdge.LEFT) {
anchor=TextAnchor.CENTER_RIGHT;
rotationAnchor=TextAnchor.CENTER_RIGHT;
angle=-Math.PI/4.0;
} else {
anchor=TextAnchor.CENTER_LEFT;
rotationAnchor=TextAnchor.CENTER_LEFT;
angle=Math.PI/4.0;
}
Tick tick=new DateTick(tickDate,tickLabel,anchor,rotationAnchor,angle);
result.add(tick);
tickDate=unit.addToDate(tickDate);
} else {
tickDate=unit.rollDate(tickDate);
}
}
return result;
}
private final Date calculateDateForPosition(RegularTimePeriod period,DateTickMarkPosition position) {
if (position==null) throw new IllegalArgumentException("Null 'position' argument.");
Date result=null;
if (position==DateTickMarkPosition.START) {
result=new Date(period.getFirstMillisecond());
} else if (position==DateTickMarkPosition.MIDDLE) {
result=new Date(period.getMiddleMillisecond());
} else if (position==DateTickMarkPosition.END) {
result=new Date(period.getLastMillisecond());
}
return result;
}
protected final double findMaximumTickLabelHeight(List ticks,Graphics2D g2,Rectangle2D drawArea,boolean vertical) {
RectangleInsets insets=getTickLabelInsets();
double maxHeight=0.0;
FontMetrics fm=g2.getFontMetrics(getTickLabelFont());
Iterator iterator=ticks.iterator();
while (iterator.hasNext()) {
Tick tick=(Tick) iterator.next();
Rectangle2D labelBounds=TextUtilities.getTextBounds(tick.getText(),g2,fm);
if (labelBounds.getWidth()+labelBounds.getHeight()>maxHeight) {
maxHeight=labelBounds.getWidth()+labelBounds.getHeight();
}
}
return maxHeight/1.5+insets.getTop()+insets.getBottom();
}
protected final double findMaximumTickLabelWidth(List ticks,Graphics2D g2,Rectangle2D drawArea,boolean vertical) {
RectangleInsets insets=getTickLabelInsets();
double maxWidth=0.0;
FontMetrics fm=g2.getFontMetrics(getTickLabelFont());
Iterator iterator=ticks.iterator();
while (iterator.hasNext()) {
Tick tick=(Tick) iterator.next();
Rectangle2D labelBounds=TextUtilities.getTextBounds(tick.getText(),g2,fm);
if (labelBounds.getWidth()+labelBounds.getHeight()>maxWidth) {
maxWidth=labelBounds.getWidth()+labelBounds.getHeight();
}
}
return maxWidth/1.5+insets.getLeft()+insets.getRight();
}
}