📄 cyclicnumberaxis.java
字号:
double jmin = 0.0; double jmax = 0.0; if (RectangleEdge.isTopOrBottom(edge)) { jmin = dataArea.getMinX(); jmax = dataArea.getMaxX(); } else if (RectangleEdge.isLeftOrRight(edge)) { jmax = dataArea.getMinY(); jmin = dataArea.getMaxY(); } if (isInverted()) { if (value == vp) { return this.boundMappedToLastCycle ? jmin : jmax; } else if (value > vp) { return jmax - (value - vp) * (jmax - jmin) / this.period; } else { return jmin + (vp - value) * (jmax - jmin) / this.period; } } else { if (value == vp) { return this.boundMappedToLastCycle ? jmax : jmin; } else if (value >= vp) { return jmin + (value - vp) * (jmax - jmin) / this.period; } else { return jmax - (vp - value) * (jmax - jmin) / this.period; } } } /** * Centers the range about the given value. * * @param value the data value. */ public void centerRange(double value) { setRange(value - this.period / 2.0, value + this.period / 2.0); } /** * This function is nearly useless since the auto range is fixed for this class to the period * The period is extended if necessary to fit the minimum size. * * @param size the size. * @param notify notify? * * @see org.jfree.chart.axis.ValueAxis#setAutoRangeMinimumSize(double, boolean) */ public void setAutoRangeMinimumSize(double size, boolean notify) { if (size > this.period) { this.period = size; } super.setAutoRangeMinimumSize(size, notify); } /** * The auto range is fixed for this class to the period by default. * This function will thus set a new period. * * @param length the length. * * @see org.jfree.chart.axis.ValueAxis#setFixedAutoRange(double) */ public void setFixedAutoRange(double length) { this.period = length; super.setFixedAutoRange(length); } /** * Sets a new axis range. The period is extended to fit the range size, if necessary. * * @param range the range. * @param turnOffAutoRange switch off the auto range. * @param notify notify? * * @see org.jfree.chart.axis.ValueAxis#setRange(org.jfree.data.Range, boolean, boolean) */ public void setRange(Range range, boolean turnOffAutoRange, boolean notify) { double size = range.getUpperBound() - range.getLowerBound(); if (size > this.period) { this.period = size; } super.setRange(range, turnOffAutoRange, notify); } /** * The cycle bound is defined as the higest value x such that "offset + period * i = x", with i * and integer and x < range.getUpperBound() * This is the value which is at both ends of the axis : x...up|low...x * The values from x to up are the valued in the current cycle. * The values from low to x are the valued in the previous cycle. * * @return the cycle bound. */ public double getCycleBound() { return Math.floor((getRange().getUpperBound() - this.offset) / this.period) * this.period + this.offset; } /** * The cycle bound is a multiple of the period, plus optionally a start offset. * <P> * <pre>cb = n * period + offset</pre><br> * * @return the current offset. * * @see #getCycleBound() */ public double getOffset() { return this.offset; } /** * The cycle bound is a multiple of the period, plus optionally a start offset. * <P> * <pre>cb = n * period + offset</pre><br> * * @param offset The offset to set. * * @see #getCycleBound() */ public void setOffset(double offset) { this.offset = offset; } /** * The cycle bound is a multiple of the period, plus optionally a start offset. * <P> * <pre>cb = n * period + offset</pre><br> * * @return the current period. * * @see #getCycleBound() */ public double getPeriod() { return this.period; } /** * The cycle bound is a multiple of the period, plus optionally a start offset. * <P> * <pre>cb = n * period + offset</pre><br> * * @param period The period to set. * * @see #getCycleBound() */ public void setPeriod(double period) { this.period = period; } /* (non-Javadoc) * @see org.jfree.chart.axis.ValueAxis#drawTickMarksAndLabels(java.awt.Graphics2D, double, * java.awt.geom.Rectangle2D, java.awt.geom.Rectangle2D, org.jfree.ui.RectangleEdge) */ protected AxisState drawTickMarksAndLabels(Graphics2D g2, double cursor, Rectangle2D plotArea, Rectangle2D dataArea, RectangleEdge edge) { this.internalMarkerWhenTicksOverlap = false; AxisState ret = super.drawTickMarksAndLabels(g2, cursor, plotArea, dataArea, edge); // continue and separate the labels only if necessary if (!this.internalMarkerWhenTicksOverlap) { return ret; } double ol = getTickMarkOutsideLength(); FontMetrics fm = g2.getFontMetrics(getTickLabelFont()); if (this.isVerticalTickLabels()) { ol = fm.getMaxAdvance(); } else { ol = fm.getHeight(); } double il = 0; if (isTickMarksVisible()) { float xx = (float) valueToJava2D(getRange().getUpperBound(), dataArea, edge); Line2D mark = null; g2.setStroke(getTickMarkStroke()); g2.setPaint(getTickMarkPaint()); if (edge == RectangleEdge.LEFT) { mark = new Line2D.Double(cursor - ol, xx, cursor + il, xx); } else if (edge == RectangleEdge.RIGHT) { mark = new Line2D.Double(cursor + ol, xx, cursor - il, xx); } else if (edge == RectangleEdge.TOP) { mark = new Line2D.Double(xx, cursor - ol, xx, cursor + il); } else if (edge == RectangleEdge.BOTTOM) { mark = new Line2D.Double(xx, cursor + ol, xx, cursor - il); } g2.draw(mark); } return ret; } /** * Draws the axis. * * @param g2 the graphics device (<code>null</code> not permitted). * @param cursor the cursor position. * @param plotArea the plot area (<code>null</code> not permitted). * @param dataArea the data area (<code>null</code> not permitted). * @param edge the edge (<code>null</code> not permitted). * @param plotState collects information about the plot (<code>null</code> permitted). * * @return the axis state (never <code>null</code>). */ public AxisState draw(Graphics2D g2, double cursor, Rectangle2D plotArea, Rectangle2D dataArea, RectangleEdge edge, PlotRenderingInfo plotState) { AxisState ret = super.draw(g2, cursor, plotArea, dataArea, edge, plotState); if (isAdvanceLineVisible()) { double xx = valueToJava2D(getRange().getUpperBound(), dataArea, edge); Line2D mark = null; g2.setStroke(getAdvanceLineStroke()); g2.setPaint(getAdvanceLinePaint()); if (edge == RectangleEdge.LEFT) { mark = new Line2D.Double(cursor, xx, cursor + dataArea.getWidth(), xx); } else if (edge == RectangleEdge.RIGHT) { mark = new Line2D.Double(cursor - dataArea.getWidth(), xx, cursor, xx); } else if (edge == RectangleEdge.TOP) { mark = new Line2D.Double(xx, cursor + dataArea.getHeight(), xx, cursor); } else if (edge == RectangleEdge.BOTTOM) { mark = new Line2D.Double(xx, cursor, xx, cursor - dataArea.getHeight()); } g2.draw(mark); } return ret; } /** * Reserve some space on each axis side because we draw a centered label at each extremity. * * @param g2 the graphics device. * @param plot the plot. * @param plotArea the plot area. * @param edge the edge. * @param space the space already reserved. * * @return the reserved space. */ public AxisSpace reserveSpace(Graphics2D g2, Plot plot, Rectangle2D plotArea, RectangleEdge edge, AxisSpace space) { this.internalMarkerCycleBoundTick = null; AxisSpace ret = super.reserveSpace(g2, plot, plotArea, edge, space); if (this.internalMarkerCycleBoundTick == null) { return ret; } FontMetrics fm = g2.getFontMetrics(getTickLabelFont()); Rectangle2D r = TextUtilities.getTextBounds( this.internalMarkerCycleBoundTick.getText(), g2, fm ); if (RectangleEdge.isTopOrBottom(edge)) { if (isVerticalTickLabels()) { space.add(r.getHeight() / 2, RectangleEdge.RIGHT); } else { space.add(r.getWidth() / 2, RectangleEdge.RIGHT); } } else if (RectangleEdge.isLeftOrRight(edge)) { if (isVerticalTickLabels()) { space.add(r.getWidth() / 2, RectangleEdge.TOP); } else { space.add(r.getHeight() / 2, RectangleEdge.TOP); } } return ret; } /** * Provides serialization support. * * @param stream the output stream. * * @throws IOException if there is an I/O error. */ private void writeObject(ObjectOutputStream stream) throws IOException { stream.defaultWriteObject(); SerialUtilities.writePaint(this.advanceLinePaint, stream); SerialUtilities.writeStroke(this.advanceLineStroke, stream); } /** * Provides serialization support. * * @param stream the input stream. * * @throws IOException if there is an I/O error. * @throws ClassNotFoundException if there is a classpath problem. */ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); this.advanceLinePaint = SerialUtilities.readPaint(stream); this.advanceLineStroke = SerialUtilities.readStroke(stream); } /** * Tests the axis for equality with another object. * * @param object the object to test against. * * @return a boolean. */ public boolean equals(Object object) { if (object == null) { return false; } if (object == this) { return true; } if (object instanceof CyclicNumberAxis) { if (super.equals(object)) { CyclicNumberAxis axis = (CyclicNumberAxis) object; boolean b0 = this.period == axis.period; boolean b1 = this.offset == axis.offset; boolean b2 = ObjectUtils.equal(this.advanceLinePaint, axis.advanceLinePaint); boolean b3 = ObjectUtils.equal(this.advanceLineStroke, axis.advanceLineStroke); boolean b4 = this.advanceLineVisible == axis.advanceLineVisible; boolean b5 = this.boundMappedToLastCycle == axis.boundMappedToLastCycle; return b0 && b1 && b2 && b3 && b4 && b5; } } return false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -