Piechart.java.
- By Anand Jain
- July 17, 2000
Java To Go!
Your Way to a Flicker-Free 3D Pie Chart
Anand Jain
Listing 2. Piechart.java.
import java.awt.*;
import java.applet.*;
import java.util.*;
public class Piechart extends Applet {
Image buffer; // used for double buffering
Graphics gContext; // used for double buffering
Label lblChartTitle;
String []lblLegend = new String[16];
Slice []slice = new Slice[16];
Color backGroundColor = Color.white;
Color []color = { new Color(43,14,114),
new Color(238,156,104),
Color.blue, new Color(223,23,122),
new Color(0,143,224),
new Color(242,155,190),
new Color(247,198,0),
new Color(127,196,36),
new Color(253,252,155),
new Color(186,112,164),
new Color(121,197,161),
new Color(143,86,68),
new Color(116,195,242),
Color.yellow, new Color(0,146,64),
new Color(245,198,144) }; // colors
int numOfSlices;
int biggestNumberIndx=0;
public final int MAXSLICES = 16;
final int chartBase = 360;
final int legendRectStartPosx=5;
final int legendRectStartPosy=215;
final int legendLblStartPosx=20;
final int legendLblStartPosy=225;
int [] intPercent = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// for disp. in chart
int legendLabelMaxLength = 8;
int xLegendDistance = 102;
int yLegendDistance = 15;
int intTotal = 0; // total number of items recd.
int [] intValue = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// values picked up from the html page
int [] intDegree = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// converted values
static int sliceno=0;
public void init() {
String chartTitle;
chartTitle = getParameter("TITLE");
lblChartTitle = new Label(chartTitle,Label.CENTER);
// center align
if(lblChartTitle==null) lblChartTitle= new Label(" ");
lblChartTitle.setBounds(0,0,25,400);
add(lblChartTitle);
readParams(); // reads the parameters from html file
} // init()
// getting the <params> from the applet
private void readParams() {
String tmpChartValues;
for(numOfSlices =0;numOfSlices < MAXSLICES;numOfSlices++) {
tmpChartValues = getParameter("SLICE"+(numOfSlices+1));
if(tmpChartValues.trim().equals("")) break;
// get out if read all values
int indexOf = tmpChartValues.indexOf("-");
String strValue = tmpChartValues.substring(0,indexOf);
lblLegend[numOfSlices] = new String(
tmpChartValues.substring(indexOf+1,tmpChartValues.length()));
float floatValue = (new Float(strValue)).floatValue();
intValue[numOfSlices] = (int)(floatValue*10000);
// converting float to int.
// but preserving decimals
// by multiplying by 10000
intTotal = intValue[numOfSlices] + intTotal;
}
allocSlices(); // find out the share of each slice
}
private void allocSlices() {
// getting the index of the biggest value
for(int i =0;i <numOfSlices;i++) {
if(intValue[biggestNumberIndx] < intValue[i]) {
biggestNumberIndx = i;
}
}
int tmp=0;
int tmp1=0;
for(int i =0;i <numOfSlices;i++) {
// allocating values - % and 360 both
if(i != biggestNumberIndx) { // if not biggest then process
float ftmp = (float) (chartBase * intValue[i]) / intTotal ;
float fpercent = (float) (100 * intValue[i]) / intTotal ;
intDegree[i] = Math.round(ftmp);
intPercent[i] = Math.round(fpercent);
tmp = tmp+intDegree[i];
tmp1=tmp1+intPercent[i];
}
else {
float ftmp = (float) (chartBase * intValue[i]) / intTotal ;
}
}
intDegree[biggestNumberIndx] = chartBase - tmp;
// remaining allocating to the biggest value
intPercent[biggestNumberIndx] = 100-tmp1;
// remaining % allocating to the biggest value
int startAngle=0;
for(int i =0;i <numOfSlices;i++) {
slice[i] = new Slice(startAngle,intDegree[i],color[i].darker());
startAngle= startAngle+intDegree[i];
}
}
public void start() {
buffer = createImage(400, 300); // used for double buffering
gContext = buffer.getGraphics(); // used for double buffering
gContext.setColor(backGroundColor);
gContext.fillRect(0,0,400,300);
gContext.setColor(Color.lightGray);
gContext.fillOval(76,110,250,99); // shadow
gContext.setColor(Color.black);
gContext.fillOval(75,101,250,100); // baseline
drawSlices(); // draw slices
drawLegends(); // draw legends
} // start()
private void drawSlices() {
for(int j=30; j>0; j-){
Slice.setDimensions(75,70+j,250,100);
for(int i =0;i <numOfSlices;i++) {
slice[i].draw(gContext);
// drawing the 'depth' of each slice
}
}
for(int i =0;i <numOfSlices;i++) {
slice[i].draw(gContext,color[i]);
// drawing the brighter version on the top
}
} private void drawLegends() {
sliceno=0;
String tmpString;
final int MAXLEGENDS_HORIZ=4, MAXLEGENDS_VERT=4;
for(int i =0; i< MAXLEGENDS_HORIZ;i++) {
for(int j =1; j<= MAXLEGENDS_VERT;j++) {
//drawing the legends
if(sliceno >= numOfSlices) break;
slice[sliceno].drawRect(new Rectangle(
legendRectStartPosx+(i*xLegendDistance),
legendRectStartPosy+(
j*yLegendDistance),10,10), gContext);
gContext.setColor(Color.black);
tmpString = lblLegend[sliceno] ;
int lengthofString = tmpString.length();
tmpString = tmpString.substring(0,(
lengthofString >legendLabelMaxLength?
legendLabelMaxLength : lengthofString));
gContext.drawString(tmpString+"
(" + intPercent[sliceno] +"%)", legendLblStartPosx+
(i*xLegendDistance),legendLblStartPosy+(j*yLegendDistance));
sliceno++;
}
if(sliceno >= numOfSlices) break;
}
}
public void paint(Graphics g) {
g.drawImage(buffer,0,0,this);
} // paint()
public void stop() { } // stop()
}