?? categoryplot.java
字號:
* Returns the pen-style (<code>Stroke</code>) used to draw the crosshair (if visible).
*
* @return the crosshair stroke.
*/
public Stroke getRangeCrosshairStroke() {
return rangeCrosshairStroke;
}
/**
* Sets the pen-style (<code>Stroke</code>) used to draw the crosshairs (if visible).
* A {@link PlotChangeEvent} is sent to all registered listeners.
*
* @param stroke the new crosshair stroke.
*/
public void setRangeCrosshairStroke(Stroke stroke) {
rangeCrosshairStroke = stroke;
notifyListeners(new PlotChangeEvent(this));
}
/**
* Returns the range crosshair color.
*
* @return the crosshair color.
*/
public Paint getRangeCrosshairPaint() {
return this.rangeCrosshairPaint;
}
/**
* Sets the Paint used to color the crosshairs (if visible) and notifies
* registered listeners that the axis has been modified.
*
* @param paint the new crosshair paint.
*/
public void setRangeCrosshairPaint(Paint paint) {
this.rangeCrosshairPaint = paint;
notifyListeners(new PlotChangeEvent(this));
}
/**
* Returns the list of annotations.
*
* @return The list of annotations.
*/
public List getAnnotations() {
return this.annotations;
}
/**
* Adds an annotation to the plot.
*
* @param annotation the annotation.
*/
public void addAnnotation(CategoryAnnotation annotation) {
if (this.annotations == null) {
this.annotations = new java.util.ArrayList();
}
this.annotations.add(annotation);
notifyListeners(new PlotChangeEvent(this));
}
/**
* Calculates the space required for the domain axis/axes.
*
* @param g2 the graphics device.
* @param plotArea the plot area.
* @param space a carrier for the result (<code>null</code> permitted).
*
* @return The required space.
*/
protected AxisSpace calculateDomainAxisSpace(Graphics2D g2, Rectangle2D plotArea,
AxisSpace space) {
if (space == null) {
space = new AxisSpace();
}
// reserve some space for the domain axis...
if (this.fixedDomainAxisSpace != null) {
if (orientation == PlotOrientation.HORIZONTAL) {
space.ensureAtLeast(this.fixedDomainAxisSpace.getLeft(), RectangleEdge.LEFT);
space.ensureAtLeast(this.fixedDomainAxisSpace.getRight(), RectangleEdge.RIGHT);
}
else if (orientation == PlotOrientation.VERTICAL) {
space.ensureAtLeast(this.fixedDomainAxisSpace.getTop(), RectangleEdge.TOP);
space.ensureAtLeast(this.fixedDomainAxisSpace.getBottom(), RectangleEdge.BOTTOM);
}
}
else {
// reserve space for the primary domain axis...
RectangleEdge domainEdge = Plot.resolveDomainAxisLocation(
getDomainAxisLocation(), this.orientation
);
if (this.domainAxis != null) {
space = this.domainAxis.reserveSpace(g2, this, plotArea, domainEdge, space);
}
else {
if (this.drawSharedDomainAxis) {
space = getDomainAxis().reserveSpace(g2, this, plotArea, domainEdge, space);
}
}
// reserve space for any secondary domain axes...
for (int i = 0; i < this.secondaryDomainAxes.size(); i++) {
Axis secondaryDomainAxis = getSecondaryDomainAxis(i);
if (secondaryDomainAxis != null) {
RectangleEdge edge = getSecondaryDomainAxisEdge(i);
space = secondaryDomainAxis.reserveSpace(g2, this, plotArea, edge, space);
}
}
}
return space;
}
/**
* Calculates the space required for the range axis/axes.
*
* @param g2 the graphics device.
* @param plotArea the plot area.
* @param space a carrier for the result (<code>null</code> permitted).
*
* @return The required space.
*/
protected AxisSpace calculateRangeAxisSpace(Graphics2D g2, Rectangle2D plotArea,
AxisSpace space) {
if (space == null) {
space = new AxisSpace();
}
// reserve some space for the range axis...
if (this.fixedRangeAxisSpace != null) {
if (orientation == PlotOrientation.HORIZONTAL) {
space.ensureAtLeast(this.fixedRangeAxisSpace.getTop(), RectangleEdge.TOP);
space.ensureAtLeast(this.fixedRangeAxisSpace.getBottom(), RectangleEdge.BOTTOM);
}
else if (orientation == PlotOrientation.VERTICAL) {
space.ensureAtLeast(this.fixedRangeAxisSpace.getLeft(), RectangleEdge.LEFT);
space.ensureAtLeast(this.fixedRangeAxisSpace.getRight(), RectangleEdge.RIGHT);
}
}
else {
Axis rangeAxis1 = this.rangeAxis;
if (rangeAxis1 != null) {
space = rangeAxis1.reserveSpace(g2, this, plotArea, getRangeAxisEdge(), space);
}
// reserve space for the secondary range axes (if any)...
for (int i = 0; i < this.secondaryRangeAxes.size(); i++) {
Axis secondaryRangeAxis = getSecondaryRangeAxis(i);
if (secondaryRangeAxis != null) {
RectangleEdge edge = getSecondaryRangeAxisEdge(i);
space = secondaryRangeAxis.reserveSpace(g2, this, plotArea, edge, space);
}
}
}
return space;
}
/**
* Calculates the space required for the axes.
*
* @param g2 the graphics device.
* @param plotArea the plot area.
*
* @return The space required for the axes.
*/
protected AxisSpace calculateAxisSpace(Graphics2D g2, Rectangle2D plotArea) {
AxisSpace space = new AxisSpace();
space = calculateRangeAxisSpace(g2, plotArea, space);
space = calculateDomainAxisSpace(g2, plotArea, space);
return space;
}
/**
* Draws the plot on a Java 2D graphics device (such as the screen or a printer).
* <P>
* At your option, you may supply an instance of {@link ChartRenderingInfo}.
* If you do, it will be populated with information about the drawing,
* including various plot dimensions and tooltip info.
*
* @param g2 the graphics device.
* @param plotArea the area within which the plot (including axes) should be drawn.
* @param info collects info as the chart is drawn.
*/
public void draw(Graphics2D g2, Rectangle2D plotArea, ChartRenderingInfo info) {
// if the plot area is too small, just return...
boolean b1 = (plotArea.getWidth() <= MINIMUM_WIDTH_TO_DRAW);
boolean b2 = (plotArea.getHeight() <= MINIMUM_HEIGHT_TO_DRAW);
if (b1 || b2) {
return;
}
// record the plot area...
if (info != null) {
info.setPlotArea(plotArea);
}
// adjust the drawing area for the plot insets (if any)...
Insets insets = getInsets();
if (insets != null) {
plotArea.setRect(plotArea.getX() + insets.left,
plotArea.getY() + insets.top,
plotArea.getWidth() - insets.left - insets.right,
plotArea.getHeight() - insets.top - insets.bottom);
}
// calculate the data area...
AxisSpace space = calculateAxisSpace(g2, plotArea);
Rectangle2D dataArea = space.shrink(plotArea, null);
if (info != null) {
info.setDataArea(dataArea);
}
// if there is a renderer, it draws the background, otherwise use the default background...
if (this.renderer != null) {
this.renderer.drawBackground(g2, this, dataArea);
}
else {
drawBackground(g2, dataArea);
}
drawAxes(g2, plotArea, dataArea);
drawGridlines(g2, dataArea);
// draw the range markers...
drawSecondaryRangeMarkers(g2, dataArea);
drawRangeMarkers(g2, dataArea);
// now render data items...
DatasetRenderingOrder order = getDatasetRenderingOrder();
if (order == DatasetRenderingOrder.STANDARD) {
render2(g2, dataArea, info);
render(g2, dataArea, info);
}
else if (order == DatasetRenderingOrder.REVERSE) {
render(g2, dataArea, info);
render2(g2, dataArea, info);
}
// draw vertical crosshair if required...
if (isRangeCrosshairVisible()) {
drawRangeLine(g2, dataArea, getRangeCrosshairValue(),
getRangeCrosshairStroke(),
getRangeCrosshairPaint());
}
// draw the annotations (if any)...
drawAnnotations(g2, dataArea);
// draw an outline around the plot area...
if (renderer != null) {
renderer.drawOutline(g2, this, dataArea);
}
else {
drawOutline(g2, dataArea);
}
}
/**
* A utility method for drawing the axes.
*
* @param g2 the graphics device.
* @param plotArea the plot area.
* @param dataArea the data area.
*/
protected void drawAxes(Graphics2D g2, Rectangle2D plotArea, Rectangle2D dataArea) {
this.axesAtTop.clear();
this.axesAtBottom.clear();
this.axesAtLeft.clear();
this.axesAtRight.clear();
// add each axis to the appropriate list...
if (this.domainAxis != null) {
addAxisToList(this.domainAxis, getDomainAxisEdge());
}
if (this.rangeAxis != null) {
addAxisToList(this.rangeAxis, getRangeAxisEdge());
}
// add secondary domain axes to lists...
for (int index = 0; index < this.secondaryDomainAxes.size(); index++) {
CategoryAxis secondaryAxis = (CategoryAxis) this.secondaryDomainAxes.get(index);
if (secondaryAxis != null) {
addAxisToList(secondaryAxis, getSecondaryDomainAxisEdge(index));
}
}
// add secondary range axes to lists...
for (int index = 0; index < this.secondaryRangeAxes.size(); index++) {
ValueAxis secondaryAxis = (ValueAxis) this.secondaryRangeAxes.get(index);
if (secondaryAxis != null) {
addAxisToList(secondaryAxis, getSecondaryRangeAxisEdge(index));
}
}
// draw the top axes
double cursor = dataArea.getMinY() - this.axisOffset.getTopSpace(dataArea.getHeight());
Iterator iterator = this.axesAtTop.iterator();
while (iterator.hasNext()) {
Axis axis = (Axis) iterator.next();
if (axis != null) {
double used = axis.draw(g2, cursor, plotArea, dataArea, RectangleEdge.TOP);
cursor = cursor - used;
}
}
// draw the bottom axes
cursor = dataArea.getMaxY() + this.axisOffset.getBottomSpace(dataArea.getHeight());
iterator = this.axesAtBottom.iterator();
while (iterator.hasNext()) {
Axis axis = (Axis) iterator.next();
if (axis != null) {
double used = axis.draw(g2, cursor, plotArea, dataArea, RectangleEdge.BOTTOM);
cursor = cursor + used;
}
}
// draw the left axes
cursor = dataArea.getMinX() - this.axisOffset.getLeftSpace(dataArea.getWidth());
iterator = this.axesAtLeft.iterator();
while (iterator.hasNext()) {
Axis axis = (Axis) iterator.next();
if (axis != null) {
double used = axis.draw(g2, cursor, plotArea, dataArea, RectangleEdge.LEFT);
cursor = cursor - used;
}
}
// draw the right axes
cursor = dataArea.getMaxX() + this.axisOffset.getRightSpace(dataArea.getWidth());
iterator = this.axesAtRight.iterator();
while (iterator.hasNext()) {
Axis axis = (Axis) iterator.next();
if (axis != null) {
double used = axis.draw(g2, cursor, plotArea, dataArea, RectangleEdge.RIGHT);
cursor = cursor + used;
}
}
}
/**
* Draws a representation of the data within the dataArea region, using
* the current renderer.
*
* @param g2 the graphics device.
* @param dataArea the region in which the data is to be drawn.
* @param info an optional object for collection dimension information.
*/
public void render(Graphics2D g2, Rectangle2D dataArea, ChartRenderingInfo info) {
if (this.renderer == null) {
return;
}
CategoryDataset data = getDataset();
if (!DatasetUtilities.isEmptyOrNull(data)) {
Shape savedClip = g2.getClip();
g2.clip(dataArea);
// set up the alpha-transparency...
Composite originalComposite = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
getForegroundAlpha()));
this.renderer.initialise(g2, dataArea, this, null, info);
int columnCount = data.getColumnCount();
int rowCount = data.getRowCount();
for (int column = 0; column < columnCount; column++) {
for (int row = 0; ro
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -