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 + -
显示快捷键?