📄 candlestickrenderer.java
字号:
/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jfreechart/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ------------------------
* CandlestickRenderer.java
* ------------------------
* (C) Copyright 2001-2007, by Object Refinery Limited.
*
* Original Authors: David Gilbert (for Object Refinery Limited);
* Sylvain Vieujot;
* Contributor(s): Richard Atkinson;
* Christian W. Zuckschwerdt;
* Jerome Fisher;
*
* Changes
* -------
* 13-Dec-2001 : Version 1. Based on code in the (now redundant)
* CandlestickPlot class, written by Sylvain Vieujot (DG);
* 23-Jan-2002 : Added DrawInfo parameter to drawItem() method (DG);
* 28-Mar-2002 : Added a property change listener mechanism so that renderers
* no longer need to be immutable. Added properties for up and
* down colors (DG);
* 04-Apr-2002 : Updated with new automatic width calculation and optional
* volume display, contributed by Sylvain Vieujot (DG);
* 09-Apr-2002 : Removed translatedRangeZero from the drawItem() method, and
* changed the return type of the drawItem method to void,
* reflecting a change in the XYItemRenderer interface. Added
* tooltip code to drawItem() method (DG);
* 25-Jun-2002 : Removed redundant code (DG);
* 05-Aug-2002 : Small modification to drawItem method to support URLs for HTML
* image maps (RA);
* 19-Sep-2002 : Fixed errors reported by Checkstyle (DG);
* 25-Mar-2003 : Implemented Serializable (DG);
* 01-May-2003 : Modified drawItem() method signature (DG);
* 30-Jun-2003 : Added support for PlotOrientation (for completeness, this
* renderer is unlikely to be used with a HORIZONTAL
* orientation) (DG);
* 30-Jul-2003 : Modified entity constructor (CZ);
* 20-Aug-2003 : Implemented Cloneable and PublicCloneable (DG);
* 29-Aug-2003 : Moved maxVolume calculation to initialise method (see bug
* report 796619) (DG);
* 02-Sep-2003 : Added maxCandleWidthInMilliseconds as workaround for bug
* 796621 (DG);
* 08-Sep-2003 : Changed ValueAxis API (DG);
* 16-Sep-2003 : Changed ChartRenderingInfo --> PlotRenderingInfo (DG);
* 13-Oct-2003 : Applied patch from Jerome Fisher to improve auto width
* calculations (DG);
* 23-Dec-2003 : Fixed bug where up and down paint are used incorrectly (DG);
* 25-Feb-2004 : Replaced CrosshairInfo with CrosshairState (DG);
* 15-Jul-2004 : Switched getX() with getXValue() and getY() with
* getYValue() (DG);
* ------------- JFREECHART 1.0.x ---------------------------------------------
* 06-Jul-2006 : Swapped calls to getX() --> getXValue(), and the same for the
* other data values (DG);
* 17-Aug-2006 : Corrections to the equals() method (DG);
* 05-Mar-2007 : Added flag to allow optional use of outline paint (DG);
* 08-Oct-2007 : Added new volumePaint field (DG);
*
*/
package org.jfree.chart.renderer.xy;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.entity.XYItemEntity;
import org.jfree.chart.event.RendererChangeEvent;
import org.jfree.chart.labels.HighLowItemLabelGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.CrosshairState;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.OHLCDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.io.SerialUtilities;
import org.jfree.ui.RectangleEdge;
import org.jfree.util.PaintUtilities;
import org.jfree.util.PublicCloneable;
/**
* A renderer that draws candlesticks on an {@link XYPlot} (requires a
* {@link OHLCDataset}).
* <P>
* This renderer does not include code to calculate the crosshair point for the
* plot.
*/
public class CandlestickRenderer extends AbstractXYItemRenderer
implements XYItemRenderer,
Cloneable,
PublicCloneable,
Serializable {
/** For serialization. */
private static final long serialVersionUID = 50390395841817121L;
/** The average width method. */
public static final int WIDTHMETHOD_AVERAGE = 0;
/** The smallest width method. */
public static final int WIDTHMETHOD_SMALLEST = 1;
/** The interval data method. */
public static final int WIDTHMETHOD_INTERVALDATA = 2;
/** The method of automatically calculating the candle width. */
private int autoWidthMethod = WIDTHMETHOD_AVERAGE;
/**
* The number (generally between 0.0 and 1.0) by which the available space
* automatically calculated for the candles will be multiplied to determine
* the actual width to use.
*/
private double autoWidthFactor = 4.5 / 7;
/** The minimum gap between one candle and the next */
private double autoWidthGap = 0.0;
/** The candle width. */
private double candleWidth;
/** The maximum candlewidth in milliseconds. */
private double maxCandleWidthInMilliseconds = 1000.0 * 60.0 * 60.0 * 20.0;
/** Temporary storage for the maximum candle width. */
private double maxCandleWidth;
/**
* The paint used to fill the candle when the price moved up from open to
* close.
*/
private transient Paint upPaint;
/**
* The paint used to fill the candle when the price moved down from open
* to close.
*/
private transient Paint downPaint;
/** A flag controlling whether or not volume bars are drawn on the chart. */
private boolean drawVolume;
/**
* The paint used to fill the volume bars (if they are visible). Once
* initialised, this field should never be set to <code>null</code>.
*
* @since 1.0.7
*/
private transient Paint volumePaint;
/** Temporary storage for the maximum volume. */
private transient double maxVolume;
/**
* A flag that controls whether or not the renderer's outline paint is
* used to draw the outline of the candlestick. The default value is
* <code>false</code> to avoid a change of behaviour for existing code.
*
* @since 1.0.5
*/
private boolean useOutlinePaint;
/**
* Creates a new renderer for candlestick charts.
*/
public CandlestickRenderer() {
this(-1.0);
}
/**
* Creates a new renderer for candlestick charts.
* <P>
* Use -1 for the candle width if you prefer the width to be calculated
* automatically.
*
* @param candleWidth The candle width.
*/
public CandlestickRenderer(double candleWidth) {
this(candleWidth, true, new HighLowItemLabelGenerator());
}
/**
* Creates a new renderer for candlestick charts.
* <P>
* Use -1 for the candle width if you prefer the width to be calculated
* automatically.
*
* @param candleWidth the candle width.
* @param drawVolume a flag indicating whether or not volume bars should
* be drawn.
* @param toolTipGenerator the tool tip generator. <code>null</code> is
* none.
*/
public CandlestickRenderer(double candleWidth, boolean drawVolume,
XYToolTipGenerator toolTipGenerator) {
super();
setBaseToolTipGenerator(toolTipGenerator);
this.candleWidth = candleWidth;
this.drawVolume = drawVolume;
this.volumePaint = Color.gray;
this.upPaint = Color.green;
this.downPaint = Color.red;
this.useOutlinePaint = false; // false preserves the old behaviour
// prior to introducing this flag
}
/**
* Returns the width of each candle.
*
* @return The candle width.
*
* @see #setCandleWidth(double)
*/
public double getCandleWidth() {
return this.candleWidth;
}
/**
* Sets the candle width and sends a {@link RendererChangeEvent} to all
* registered listeners.
* <P>
* If you set the width to a negative value, the renderer will calculate
* the candle width automatically based on the space available on the chart.
*
* @param width The width.
* @see #setAutoWidthMethod(int)
* @see #setAutoWidthGap(double)
* @see #setAutoWidthFactor(double)
* @see #setMaxCandleWidthInMilliseconds(double)
*/
public void setCandleWidth(double width) {
if (width != this.candleWidth) {
this.candleWidth = width;
fireChangeEvent();
}
}
/**
* Returns the maximum width (in milliseconds) of each candle.
*
* @return The maximum candle width in milliseconds.
*
* @see #setMaxCandleWidthInMilliseconds(double)
*/
public double getMaxCandleWidthInMilliseconds() {
return this.maxCandleWidthInMilliseconds;
}
/**
* Sets the maximum candle width (in milliseconds) and sends a
* {@link RendererChangeEvent} to all registered listeners.
*
* @param millis The maximum width.
*
* @see #getMaxCandleWidthInMilliseconds()
* @see #setCandleWidth(double)
* @see #setAutoWidthMethod(int)
* @see #setAutoWidthGap(double)
* @see #setAutoWidthFactor(double)
*/
public void setMaxCandleWidthInMilliseconds(double millis) {
this.maxCandleWidthInMilliseconds = millis;
fireChangeEvent();
}
/**
* Returns the method of automatically calculating the candle width.
*
* @return The method of automatically calculating the candle width.
*
* @see #setAutoWidthMethod(int)
*/
public int getAutoWidthMethod() {
return this.autoWidthMethod;
}
/**
* Sets the method of automatically calculating the candle width and
* sends a {@link RendererChangeEvent} to all registered listeners.
* <p>
* <code>WIDTHMETHOD_AVERAGE</code>: Divides the entire display (ignoring
* scale factor) by the number of items, and uses this as the available
* width.<br>
* <code>WIDTHMETHOD_SMALLEST</code>: Checks the interval between each
* item, and uses the smallest as the available width.<br>
* <code>WIDTHMETHOD_INTERVALDATA</code>: Assumes that the dataset supports
* the IntervalXYDataset interface, and uses the startXValue - endXValue as
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -