📄 sdachart.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package cn.sda.ui;import java.util.Vector;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Font;/** * * @author Administrator */public class SDAChart extends SDABaseControl { private int borderColor = SDAConsts.clBlack; private int scaleLineColor = SDAConsts.clFocusShadow; private String titleText = ""; private int titleTextAlign = SDAConsts.alignCenter; private boolean showTitleText = false; private String footText = ""; private int footTextAlign = SDAConsts.alignCenter; private boolean showFootText = false; private String axisText = ""; private int axisTextAlign = SDAConsts.alignCenter; private boolean showAxisText = false; //柱图宽度 private int barChartWidth = 8; //参考线颜色 private int refLineColor = SDAConsts.clFocusShadow; private boolean showRefLine = true; //列表(所有的series里面的x值都要各自排序) private Vector seriesList = null; //坐标排序 private Vector xValueList = null; private Vector yValueList = null; //Y最大值 private double maxYInt = 0; //最值记录 private double maxXValue = 0; private double minXValue = 0; private double maxYValue = 0; private double minYValue = 0; //实际像素开始位置和区域大小 private int yStartPos = 0; private int xStartPos = 0; private int yLen = 0; private int xLen = 0; public SDAChart() { super(); visible = true; width = 200; height = 160; backColor=SDAConsts.clWhite; seriesList = new Vector(); xValueList = new Vector(); yValueList = new Vector(); } public void paint() { if (!IsCanPaint()) { return; } Graphics g = form.getGraphics(); SetClip(g); g.setFont(getFont()); //变量 int thisWidth = getWidth(); int thisHeight = getHeight(); //背景 if (!transparent) { g.setColor(backColor); fillRect(g, 0, 0, thisWidth, thisHeight); } //外框 g.setColor(borderColor); drawRect(g, 0, 0, thisWidth, thisHeight); //画标尺 paintScale(g, canPaintScale()); //画数据 for (int i = 0; i < seriesList.size(); i++) { if (((SDAChartSeries) seriesList.elementAt(i)).getChartType() == SDAChartSeries.ctLine) { paintLineSeries(g, (SDAChartSeries) seriesList.elementAt(i)); } if (((SDAChartSeries) seriesList.elementAt(i)).getChartType() == SDAChartSeries.ctBar) { paintBarSeries(g, (SDAChartSeries) seriesList.elementAt(i)); } if (((SDAChartSeries) seriesList.elementAt(i)).getChartType() == SDAChartSeries.ctPie) { paintPieSeries(g, (SDAChartSeries) seriesList.elementAt(i)); } if (((SDAChartSeries) seriesList.elementAt(i)).getChartType() == SDAChartSeries.ctPoint) { paintPointSeries(g, (SDAChartSeries) seriesList.elementAt(i)); } } PaintChilds(); } //判断是否可以画标尺 private boolean canPaintScale() { boolean result = true; for (int i = 0; i < seriesList.size(); i++) { if (((SDAChartSeries) seriesList.elementAt(i)).getChartType() == SDAChartSeries.ctPie) { result = false; break; } } return result; } //排序 private void sortValue() { //各自Series排序(对x方向升序) SDAChartSeries series = null; SDAChartSeries.PointData pd = null; SDAChartSeries.PointData pd1 = null; int num = 0; for (int i = 0; i < seriesList.size(); i++) { series = (SDAChartSeries) seriesList.elementAt(i); num = series.getDataCount(); for (int j = 0; j < num; j++) { pd = (SDAChartSeries.PointData) series.getData(j); for (int k = j + 1; k < num; k++) { pd1 = (SDAChartSeries.PointData) series.getData(k); if (pd.xValue > pd1.xValue) { series.dataList.setElementAt(pd, k); series.dataList.setElementAt(pd1, j); pd = (SDAChartSeries.PointData) series.getData(j); } } } } //所有x方向排序(升序) xValueList.removeAllElements(); for (int i = 0; i < seriesList.size(); i++) { series = (SDAChartSeries) seriesList.elementAt(i); for (int j = 0; j < series.getDataCount(); j++) { pd = (SDAChartSeries.PointData) series.getData(j); xValueList.addElement(pd); } } for (int i = 0; i < xValueList.size(); i++) { pd = (SDAChartSeries.PointData) xValueList.elementAt(i); for (int j = i + 1; j < xValueList.size(); j++) { pd1 = (SDAChartSeries.PointData) xValueList.elementAt(j); if (pd.xValue > pd1.xValue) { xValueList.setElementAt(pd, j); xValueList.setElementAt(pd1, i); pd = (SDAChartSeries.PointData) xValueList.elementAt(i); } } } //所有y方向排序(升序) yValueList.removeAllElements(); for (int i = 0; i < seriesList.size(); i++) { series = (SDAChartSeries) seriesList.elementAt(i); for (int j = 0; j < series.getDataCount(); j++) { pd = (SDAChartSeries.PointData) series.getData(j); yValueList.addElement(pd); } } for (int i = 0; i < yValueList.size(); i++) { pd = (SDAChartSeries.PointData) yValueList.elementAt(i); for (int j = i + 1; j < yValueList.size(); j++) { pd1 = (SDAChartSeries.PointData) yValueList.elementAt(j); if (pd.yValue > pd1.yValue) { yValueList.setElementAt(pd, j); yValueList.setElementAt(pd1, i); pd = (SDAChartSeries.PointData) yValueList.elementAt(i); } } } } //乘方运算 private double getMulValue(int miValue) { double result = 1; if (miValue > 0) { for (int i = 0; i < miValue; i++) { result *= 10; } } if (miValue < 0) { for (int i = 0; i > miValue; i--) { result /= 10; } } return result; } //计算y方向标尺刻度 private double calYScale() { Font ft = getFont(); //计算显示刻度(排序后) double maxValue = yValueList.size() > 0 ? ((SDAChartSeries.PointData) yValueList.elementAt(yValueList.size() - 1)).yValue : 0; double minValue = yValueList.size() > 0 ? ((SDAChartSeries.PointData) yValueList.elementAt(0)).yValue : 0; if (maxValue < 0) { maxValue = 0; } if (minValue > 0) { minValue = 0; //判断是否可以容纳的下文字(注意两边的空间) } int sint = (showTitleText ? ft.getHeight() : 0) + (showFootText ? ft.getHeight() : 0); //首先判断1 double max = (int) (maxValue / 1) * 1; double min = (int) (minValue / 1) * 1; maxYInt = max; //两边空余一个 int sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 int allInt = (int) (max - min + sideInt); //最小单元 double minUnit = 1; if (ft.getHeight() * allInt >= getHeight() - sint) { //分割稠密(稀化) for (int i = 0; i < 64; i++) { minUnit = getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt >= getHeight() - sint) { minUnit = 2 * getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt >= getHeight() - sint) { minUnit = 5 * getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt >= getHeight() - sint) { continue; } else { break; } } else { break; } } else { break; } } //获取到合适的 } else { //分割太稀(稠化) int iInt = 0; int mulInt = 1; for (int i = -1; i > -64; i--) { iInt = i; mulInt = 5; minUnit = 5 * getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt < getHeight() - sint) { mulInt = 2; minUnit = 2 * getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt < getHeight() - sint) { mulInt = 1; minUnit = getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.getHeight() * allInt < getHeight() - sint) { continue; } else { break; } } else { break; } } else { break; } } if (mulInt == 5) { mulInt = 1; } if (mulInt == 2) { mulInt = 5; } minUnit = mulInt * getMulValue(iInt + 1); } maxYValue = maxValue > max ? max + minUnit : max; minYValue = minValue < min ? min - minUnit : min; return minUnit; } //计算x方向标尺刻度 private double calXScale() { Font ft = getFont(); //计算显示刻度(排序后) double maxValue = xValueList.size() > 0 ? ((SDAChartSeries.PointData) xValueList.elementAt(xValueList.size() - 1)).xValue : 0; double minValue = xValueList.size() > 0 ? ((SDAChartSeries.PointData) xValueList.elementAt(0)).xValue : 0; //判断是否可以容纳的下文字(注意两边的空间) int sint = (showAxisText ? ft.charWidth('x') : 0) + (ft.stringWidth(String.valueOf(maxYInt))); //首先判断1 double max = (int) (maxValue / 1) * 1; double min = (int) (minValue / 1) * 1; //两边空余一个 int sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 int allInt = (int) (max - min + sideInt); //最小单元 double minUnit = 1; if (ft.stringWidth(String.valueOf(max)) * allInt >= getWidth() - sint) { //分割稠密(稀化) for (int i = 0; i < 64; i++) { minUnit = getMulValue(i); max = (int) (maxValue / minUnit) * minUnit; min = (int) (minValue / minUnit) * minUnit; sideInt = (int) ((maxValue > max ? 1 : 0) + (minValue < min ? 1 : 0)); //所有的数量 allInt = (int) ((max - min + sideInt) / minUnit); if (ft.stringWidth(String.valueOf(max)) * allInt >= getWidth() - sint) { minUnit = 2 * getMulValue(i); max = (int) (maxValue / minUnit) * minUnit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -