?? thermometerplot.java
字號:
}
/**
* Sets the range.
*
* @param range the range type.
* @param low the low value.
* @param high the high value.
*/
public void setSubrange(int range, double low, double high) {
if ((range >= 0) && (range < 3)) {
this.subrangeInfo[range][RANGE_HIGH] = high;
this.subrangeInfo[range][RANGE_LOW] = low;
}
}
/**
* Sets the display range.
*
* @param range the range type.
* @param low the low value.
* @param high the high value.
*/
public void setDisplayRange(int range, double low, double high) {
if ((range >= 0) && (range < this.subrangeInfo.length)
&& isValidNumber(high) && isValidNumber(low)) {
if (high > low) {
this.subrangeInfo[range][DISPLAY_HIGH] = high;
this.subrangeInfo[range][DISPLAY_LOW] = low;
}
else {
this.subrangeInfo[range][DISPLAY_HIGH] = low;
this.subrangeInfo[range][DISPLAY_LOW] = high;
}
}
}
/**
* Gets the paint used for a particular subrange.
*
* @param range the range.
*
* @return The paint.
*/
public Paint getSubrangePaint(int range) {
if ((range >= 0) && (range < this.subrangePaint.length)) {
return this.subrangePaint[range];
}
else {
return this.mercuryPaint;
}
}
/**
* Sets the paint to be used for a range.
*
* @param range the range.
* @param paint the paint to be applied.
*/
public void setSubrangePaint(int range, Paint paint) {
if ((range >= 0)
&& (range < this.subrangePaint.length) && (paint != null)) {
this.subrangePaint[range] = paint;
notifyListeners(new PlotChangeEvent(this));
}
}
/**
* Returns a flag that controls whether or not the thermometer axis zooms
* to display the subrange within which the data value falls.
*
* @return The flag.
*/
public boolean getFollowDataInSubranges() {
return this.followDataInSubranges;
}
/**
* Sets the flag that controls whether or not the thermometer axis zooms
* to display the subrange within which the data value falls.
*
* @param flag the flag.
*/
public void setFollowDataInSubranges(boolean flag) {
this.followDataInSubranges = flag;
notifyListeners(new PlotChangeEvent(this));
}
/**
* Returns a flag that controls whether or not the mercury color changes
* for each subrange.
*
* @return The flag.
*/
public boolean getUseSubrangePaint() {
return this.useSubrangePaint;
}
/**
* Sets the range colour change option.
*
* @param flag The new range colour change option
*/
public void setUseSubrangePaint(boolean flag) {
this.useSubrangePaint = flag;
notifyListeners(new PlotChangeEvent(this));
}
/**
* Draws the plot on a Java 2D graphics device (such as the screen or a
* printer).
*
* @param g2 the graphics device.
* @param area the area within which the plot should be drawn.
* @param anchor the anchor point (<code>null</code> permitted).
* @param parentState the state from the parent plot, if there is one.
* @param info collects info about the drawing.
*/
public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor,
PlotState parentState,
PlotRenderingInfo info) {
RoundRectangle2D outerStem = new RoundRectangle2D.Double();
RoundRectangle2D innerStem = new RoundRectangle2D.Double();
RoundRectangle2D mercuryStem = new RoundRectangle2D.Double();
Ellipse2D outerBulb = new Ellipse2D.Double();
Ellipse2D innerBulb = new Ellipse2D.Double();
String temp = null;
FontMetrics metrics = null;
if (info != null) {
info.setPlotArea(area);
}
// adjust for insets...
RectangleInsets insets = getInsets();
insets.trim(area);
drawBackground(g2, area);
// adjust for padding...
//this.padding.trim(plotArea);
int midX = (int) (area.getX() + (area.getWidth() / 2));
int midY = (int) (area.getY() + (area.getHeight() / 2));
int stemTop = (int) (area.getMinY() + BULB_RADIUS);
int stemBottom = (int) (area.getMaxY() - BULB_DIAMETER);
Rectangle2D dataArea = new Rectangle2D.Double(
midX - COLUMN_RADIUS, stemTop, COLUMN_RADIUS, stemBottom - stemTop
);
outerBulb.setFrame(
midX - BULB_RADIUS, stemBottom, BULB_DIAMETER, BULB_DIAMETER
);
outerStem.setRoundRect(
midX - COLUMN_RADIUS, area.getMinY(), COLUMN_DIAMETER,
stemBottom + BULB_DIAMETER - stemTop,
COLUMN_DIAMETER, COLUMN_DIAMETER
);
Area outerThermometer = new Area(outerBulb);
Area tempArea = new Area(outerStem);
outerThermometer.add(tempArea);
innerBulb.setFrame(
midX - BULB_RADIUS + GAP_RADIUS, stemBottom + GAP_RADIUS,
BULB_DIAMETER - GAP_DIAMETER, BULB_DIAMETER - GAP_DIAMETER
);
innerStem.setRoundRect(
midX - COLUMN_RADIUS + GAP_RADIUS, area.getMinY() + GAP_RADIUS,
COLUMN_DIAMETER - GAP_DIAMETER,
stemBottom + BULB_DIAMETER - GAP_DIAMETER - stemTop,
COLUMN_DIAMETER - GAP_DIAMETER, COLUMN_DIAMETER - GAP_DIAMETER
);
Area innerThermometer = new Area(innerBulb);
tempArea = new Area(innerStem);
innerThermometer.add(tempArea);
if ((this.dataset != null) && (this.dataset.getValue() != null)) {
double current = this.dataset.getValue().doubleValue();
double ds = this.rangeAxis.valueToJava2D(
current, dataArea, RectangleEdge.LEFT
);
int i = COLUMN_DIAMETER - GAP_DIAMETER; // already calculated
int j = COLUMN_RADIUS - GAP_RADIUS; // already calculated
int l = (i / 2);
int k = (int) Math.round(ds);
if (k < (GAP_RADIUS + area.getMinY())) {
k = (int) (GAP_RADIUS + area.getMinY());
l = BULB_RADIUS;
}
Area mercury = new Area(innerBulb);
if (k < (stemBottom + BULB_RADIUS)) {
mercuryStem.setRoundRect(
midX - j, k, i, (stemBottom + BULB_RADIUS) - k, l, l
);
tempArea = new Area(mercuryStem);
mercury.add(tempArea);
}
g2.setPaint(getCurrentPaint());
g2.fill(mercury);
// draw range indicators...
if (this.subrangeIndicatorsVisible) {
g2.setStroke(this.subrangeIndicatorStroke);
Range range = this.rangeAxis.getRange();
// draw start of normal range
double value = this.subrangeInfo[NORMAL][RANGE_LOW];
if (range.contains(value)) {
double x = midX + COLUMN_RADIUS + 2;
double y = this.rangeAxis.valueToJava2D(
value, dataArea, RectangleEdge.LEFT
);
Line2D line = new Line2D.Double(x, y, x + 10, y);
g2.setPaint(this.subrangePaint[NORMAL]);
g2.draw(line);
}
// draw start of warning range
value = this.subrangeInfo[WARNING][RANGE_LOW];
if (range.contains(value)) {
double x = midX + COLUMN_RADIUS + 2;
double y = this.rangeAxis.valueToJava2D(
value, dataArea, RectangleEdge.LEFT
);
Line2D line = new Line2D.Double(x, y, x + 10, y);
g2.setPaint(this.subrangePaint[WARNING]);
g2.draw(line);
}
// draw start of critical range
value = this.subrangeInfo[CRITICAL][RANGE_LOW];
if (range.contains(value)) {
double x = midX + COLUMN_RADIUS + 2;
double y = this.rangeAxis.valueToJava2D(
value, dataArea, RectangleEdge.LEFT
);
Line2D line = new Line2D.Double(x, y, x + 10, y);
g2.setPaint(this.subrangePaint[CRITICAL]);
g2.draw(line);
}
}
// draw the axis...
if ((this.rangeAxis != null) && (this.axisLocation != NONE)) {
int drawWidth = AXIS_GAP;
if (this.showValueLines) {
drawWidth += COLUMN_DIAMETER;
}
Rectangle2D drawArea;
double cursor = 0;
switch (this.axisLocation) {
case RIGHT:
cursor = midX + COLUMN_RADIUS;
drawArea = new Rectangle2D.Double(
cursor,
stemTop,
drawWidth,
(stemBottom - stemTop + 1)
);
this.rangeAxis.draw(
g2, cursor, area, drawArea,
RectangleEdge.RIGHT, null
);
break;
case LEFT:
default:
//cursor = midX - COLUMN_RADIUS - AXIS_GAP;
cursor = midX - COLUMN_RADIUS;
drawArea = new Rectangle2D.Double(
cursor,
stemTop,
drawWidth,
(stemBottom - stemTop + 1)
);
this.rangeAxis.draw(
g2, cursor, area, drawArea,
RectangleEdge.LEFT, null
);
break;
}
}
// draw text value on screen
g2.setFont(this.valueFont);
g2.setPaint(this.valuePaint);
metrics = g2.getFontMetrics();
switch (this.valueLocation) {
case RIGHT:
g2.drawString(
this.valueFormat.format(current),
midX + COLUMN_RADIUS + GAP_RADIUS, midY
);
break;
case LEFT:
String valueString = this.valueFormat.format(current);
int stringWidth = metrics.stringWidth(valueString);
g2.drawString(
valueString,
midX - COLUMN_RADIUS - GAP_RADIUS - stringWidth, midY
);
break;
case BULB:
temp = this.valueFormat.format(current);
i = metrics.stringWidth(temp) / 2;
g2.drawString(
temp, midX - i,
stemBottom + BULB_RADIUS + GAP_RADIUS
);
break;
default:
}
/***/
}
g2.setPaint(this.thermometerPaint);
g2.setFont(this.valueFont);
// draw units indicator
metrics = g2.getFontMetrics();
int tickX1 = midX - COLUMN_RADIUS - GAP_DIAMETER
- metrics.stringWidth(UNITS[this.units]);
if (tickX1 > area.getMinX()) {
g2.drawString(
UNITS[this.units], tickX1, (int) (area.getMinY() + 20)
);
}
// draw thermometer outline
g2.setStroke(this.thermometerStroke);
g2.draw(outerThermometer);
g2.draw(innerThermometer);
drawOutline(g2, area);
}
/**
* A zoom method that does nothing. Plots are required to support the
* zoom operation. In the case of a thermometer chart, it doesn't make
* sense to zoom in or out, so the method is empty.
*
* @param percent the zoom percentage.
*/
public void zoom(double percent) {
// intentionally blank
}
/**
* Returns a short string describing the type of plot.
*
* @return A short string describing the type of plot.
*/
public String getPlotType() {
return localizationResources.getString("Thermometer_Plot");
}
/**
* Checks to see if a new value means the axis range needs adjusting.
*
* @param event the dataset change event.
*/
public void datasetChanged(DatasetChangeEvent event) {
Number vn = this.dataset.getValue();
if (vn != null) {
double value = vn.doubleValue();
if (inSubrange(NORMAL, value)) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -