thermometerplot.java
来自「JfreeChart 常用图表例子」· Java 代码 · 共 1,475 行 · 第 1/3 页
JAVA
1,475 行
notifyListeners(new PlotChangeEvent(this)); } } /** * Returns the paint used to draw the thermometer outline. * * @return The paint. */ public Paint getThermometerPaint() { return this.thermometerPaint; } /** * Sets the paint used to draw the thermometer outline. * * @param paint the new paint (null ignored). */ public void setThermometerPaint(Paint paint) { if (paint != null) { this.thermometerPaint = paint; notifyListeners(new PlotChangeEvent(this)); } } /** * Returns the unit display type (none/Fahrenheit/Celcius/Kelvin). * * @return The units type. */ public int getUnits() { return this.units; } /** * Sets the units to be displayed in the thermometer. * <p> * Use one of the following constants: * * <ul> * <li>UNITS_NONE : no units displayed.</li> * <li>UNITS_FAHRENHEIT : units displayed in Fahrenheit.</li> * <li>UNITS_CELCIUS : units displayed in Celcius.</li> * <li>UNITS_KELVIN : units displayed in Kelvin.</li> * </ul> * * @param u the new unit type. */ public void setUnits(int u) { if ((u >= 0) && (u < UNITS.length)) { if (this.units != u) { this.units = u; notifyListeners(new PlotChangeEvent(this)); } } } /** * Sets the unit type. * * @param u the unit type (null ignored). */ public void setUnits(String u) { if (u == null) { return; } u = u.toUpperCase().trim(); for (int i = 0; i < UNITS.length; ++i) { if (u.equals(UNITS[i].toUpperCase().trim())) { setUnits(i); i = UNITS.length; } } } /** * Returns the value location. * * @return The location. */ public int getValueLocation() { return this.valueLocation; } /** * Sets the location at which the current value is displayed. * <P> * The location can be one of the constants: * <code>NONE</code>, * <code>RIGHT</code> * <code>LEFT</code> and * <code>BULB</code>. * * @param location the location. */ public void setValueLocation(int location) { if ((location >= 0) && (location < 4)) { this.valueLocation = location; notifyListeners(new PlotChangeEvent(this)); } else { throw new IllegalArgumentException("Location not recognised."); } } /** * Sets the location at which the axis is displayed with reference to the * bulb. * <P> * The location can be one of the constants: * <code>NONE</code>, * <code>RIGHT</code> and * <code>LEFT</code>. * * @param location the location. */ public void setAxisLocation(int location) { if ((location >= 0) && (location < 3)) { this.axisLocation = location; notifyListeners(new PlotChangeEvent(this)); } else { throw new IllegalArgumentException("Location not recognised."); } } /** * Returns the axis location. * * @return The location. */ public int getAxisLocation() { return this.axisLocation; } /** * Gets the font used to display the current value. * * @return The font. */ public Font getValueFont() { return this.valueFont; } /** * Sets the font used to display the current value. * * @param f the new font. */ public void setValueFont(Font f) { if ((f != null) && (!this.valueFont.equals(f))) { this.valueFont = f; notifyListeners(new PlotChangeEvent(this)); } } /** * Gets the paint used to display the current value. * * @return The paint. */ public Paint getValuePaint() { return this.valuePaint; } /** * Sets the paint used to display the current value. * * @param p the new paint. */ public void setValuePaint(Paint p) { if ((p != null) && (!this.valuePaint.equals(p))) { this.valuePaint = p; notifyListeners(new PlotChangeEvent(this)); } } /** * Sets the formatter for the value label. * * @param formatter the new formatter. */ public void setValueFormat(NumberFormat formatter) { if (formatter != null) { this.valueFormat = formatter; notifyListeners(new PlotChangeEvent(this)); } } /** * Returns the default mercury paint. * * @return The paint. */ public Paint getMercuryPaint() { return this.mercuryPaint; } /** * Sets the default mercury paint. * * @param paint the new paint. */ public void setMercuryPaint(Paint paint) { this.mercuryPaint = paint; notifyListeners(new PlotChangeEvent(this)); } /** * Returns the flag that controls whether not value lines are displayed. * * @return The flag. */ public boolean getShowValueLines() { return this.showValueLines; } /** * Sets the display as to whether to show value lines in the output. * * @param b Whether to show value lines in the thermometer */ public void setShowValueLines(boolean b) { this.showValueLines = b; notifyListeners(new PlotChangeEvent(this)); } /** * Sets information for a particular range. * * @param range the range to specify information about. * @param low the low value for the range * @param hi the high value for the range */ public void setSubrangeInfo(int range, double low, double hi) { setSubrangeInfo(range, low, hi, low, hi); } /** * Sets the subrangeInfo attribute of the ThermometerPlot object * * @param range the new rangeInfo value. * @param rangeLow the new rangeInfo value * @param rangeHigh the new rangeInfo value * @param displayLow the new rangeInfo value * @param displayHigh the new rangeInfo value */ public void setSubrangeInfo(int range, double rangeLow, double rangeHigh, double displayLow, double displayHigh) { if ((range >= 0) && (range < 3)) { setSubrange(range, rangeLow, rangeHigh); setDisplayRange(range, displayLow, displayHigh); setAxisRange(); notifyListeners(new PlotChangeEvent(this)); } } /** * 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] = high; this.subrangeInfo[range][DISPLAY_LOW] = low; } } } /** * 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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?