Hi
i have a program i want to show data in each pie for which that that pie is constructed.
thaks
amit
=====================================
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class Charts2D extends JFrame
{
public Charts2D() {
super("2D Charts");
setSize(720, 280);
getContentPane().setLayout(new GridLayout(1, 3, 10, 0));
getContentPane().setBackground(Color.white);
//int nData = 10;
int[] nData = {102,87,18,95 };
int[] xData = nData;//new int[nData];
int[] yData = nData;//new int[nData];
for (int k=0; k<nData.length; k++) {
xData[k] = k;
yData[k] = (int)(Math.random()*100);
if (k > 0)
yData[k] = (yData[k-1] + yData[k])/2;
}
System.out.println("####### nData "+nData+" xData "+xData+" yData "+yData);
System.out.println("Math.random()*100) "+(int)(Math.random()*100));
JChart2D chart = new JChart2D(JChart2D.CHART_PIE, nData, xData,yData, "Pie Chart");
ImageIcon icon = new ImageIcon("hubble.gif");
chart.setEffectIndex(JChart2D.EFFECT_IMAGE);
chart.enterData(nData);
getContentPane().add(chart);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(
String argv[]) {
new Charts2D();
}
}
class JChart2D extends JPanel
{
int[] nData, percents;
int dataTotal;
final int PAD = 25, R_PAD = 5;
public static final int CHART_LINE = 0;
public static final int CHART_COLUMN = 1;
public static final int CHART_PIE = 2;
public static final int EFFECT_PLAIN = 0;
public static final int EFFECT_GRADIENT = 2;
public static final int EFFECT_IMAGE = 3;
protected int m_chartType = CHART_LINE;
protected JLabel m_title;
protected ChartPanel m_chart;
protected int[] m_nData;
protected int[] m_xData;
protected int[] m_yData;
protected int m_xMin;
protected int m_xMax;
protected int m_yMin;
protected int m_yMax;
protected double[] m_pieData;
protected int m_effectIndex = EFFECT_PLAIN;
protected Stroke m_stroke;
protected GradientPaint m_gradient;
protected Image m_foregroundImage;
protected Color m_lineColor = Color.red;
protected Color m_columnColor = Color.yellow;
protected int m_columnWidth = 15;
protected boolean m_drawShadow = false;
public JChart2D(int type, int[] nData,int[] yData, String text)
{
this(type, nData, null, yData, text);
}
public JChart2D(int type, int[] nData, int[] xData,int[] yData, String text)
{
super(new BorderLayout());
setBackground(Color.white);
m_title = new JLabel(text, JLabel.CENTER);
add(m_title, BorderLayout.NORTH);
m_chartType = type;
if (xData==null)
{
//xData = new int[nData];
for (int k=0; k<nData.length; k++)
xData[k] = k;
}
if (yData == null)
throw new IllegalArgumentException("yData can't be null");
if (nData.length > yData.length)
throw new IllegalArgumentException("Insufficient yData length");
if (nData.length > xData.length)
throw new IllegalArgumentException("Insufficient xData length");
m_nData = nData;
m_xData = xData;
m_yData = yData;
m_xMin = m_xMax = 0; // To include 0 into the interval
m_yMin = m_yMax = 0;
for (int k=0; k<m_nData.length; k++)
{
m_xMin = Math.min(m_xMin, m_xData[k]);
m_xMax = Math.max(m_xMax, m_xData[k]);
m_yMin = Math.min(m_yMin, m_yData[k]);
m_yMax = Math.max(m_yMax, m_yData[k]);
}
if (m_xMin == m_xMax)
m_xMax++;
if (m_yMin == m_yMax)
m_yMax++;
if (m_chartType == CHART_PIE)
{
double sum = 0;
for (int k=0; k<m_nData.length; k++)
{
m_yData[k] = Math.max(m_yData[k], 0);
sum += m_yData[k];
}
m_pieData = new double[m_nData.length];
for (int k=0; k<m_nData.length; k++)
{
m_pieData[k] = m_yData[k]*360.0/sum;
System.out.println("m_pieData[k]"+m_pieData[k]);
}
}
m_chart = new ChartPanel();
add(m_chart, BorderLayout.CENTER);
}
public void setEffectIndex(int effectIndex) {
m_effectIndex = effectIndex;
repaint();
}
public int getEffectIndex() { return m_effectIndex; }
public void setStroke(Stroke stroke) {
m_stroke = stroke;
m_chart.repaint();
}
public Stroke getStroke() { return m_stroke; }
public void setGradient(GradientPaint gradient) {
m_gradient = gradient;
repaint();
}
public GradientPaint getGradient() { return m_gradient; }
class ChartPanel extends JComponent
{
int m_xMargin = 5;
int m_yMargin = 5;
int m_pieGap = 10;
int m_x;
int m_y;
int m_w;
int m_h;
ChartPanel() {
enableEvents(ComponentEvent.COMPONENT_RESIZED);
}
protected void processComponentEvent(ComponentEvent e) {
calcDimensions();
}
public void calcDimensions() {
Dimension d = getSize();
m_x = m_xMargin;
m_y = m_yMargin;
m_w = d.width-2*m_xMargin;
m_h = d.height-2*m_yMargin;
}
//////////////////////////////////////////
public void paintComponent(Graphics g) {
int width = getWidth();
int height = getHeight();
int xp,yp;
String s;
int dataWidth, dataHeight;
int cx = width/2;
int cy = height/2;
Graphics2D g2 = (Graphics2D) g;
int x0 = 0;
int y0 = 0;
Font font = new Font("lucida sans unicode", Font.PLAIN, 16);
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
if (m_stroke != null)
g2.setStroke(m_stroke);
GeneralPath path = new GeneralPath();
///////////////////// chart /////////////////////////
switch (m_chartType) {
case CHART_PIE:
double start = 0.0;
double finish = 0.0;
int ww = m_w - 2*m_pieGap;
int hh = m_h - 2*m_pieGap;
int rcolor =30;
int gcolor =20;
int bcolor =10;
for (int k=0; k<m_nData.length; k++)
{
finish = start+m_pieData[k];
s = String.valueOf(percents[k]) + "%";
double f1 = Math.min(90-start, 90-finish);
double f2 = Math.max(90-start, 90-finish);
System.out.println("%%%%%%%%%%%%% finish "+finish+" "+f1+" "+f2);
Shape shp = new Arc2D.Double(m_x, m_y, ww, hh,f1, f2-f1, Arc2D.PIE);
//this is where i want to show data( 102,87,18,95) in each pie. can someone write the code for this.
double f = (f1 + f2)/2*Math.PI/180;
AffineTransform s1 = AffineTransform.getTranslateInstance(m_pieGap*Math.cos(f),-m_pieGap*Math.sin(f));
g2.setColor(new Color(0, 140, 180));
s1.translate(m_pieGap, m_pieGap);
Shape piece = s1.createTransformedShape(shp);
path.append(piece, false);
g2.fill(piece);
start = finish;
}
if (m_effectIndex==EFFECT_GRADIENT && m_gradient != null)
{
g2.setPaint(m_gradient);
g2.fill(path);
}
else if (m_effectIndex==EFFECT_IMAGE &&m_foregroundImage != null)
{
fillByImage(g2, path, 0);
}
else {
g2.setColor(m_columnColor);
g2.fill(path);
}
g2.setColor(m_lineColor);
g2.draw(path);
break;
}
}
protected void fillByImage(Graphics2D g2,Shape shape, int xOffset) {
if (m_foregroundImage == null)
return;
int wImg = m_foregroundImage.getWidth(this);
int hImg = m_foregroundImage.getHeight(this);
if (wImg <=0 || hImg <= 0)
return;
//g2.setClip(shape);
Rectangle bounds = shape.getBounds();
System.out.println("bounds "+bounds);
for (int xx = bounds.x+xOffset;xx < bounds.x+bounds.width; xx += wImg)
for (int yy = bounds.y; yy < bounds.y+bounds.height;yy += hImg)
g2.drawString("x", xx, yy);
}
}
public void prepareData()
{
for(int i = 0; i < nData.length; i++)
dataTotal += nData[i];
percents = new int[nData.length];
int dataPlus = 0;
for(int i = 0; i < nData.length; i++){
dataPlus += nData[i];
percents[i] = Math.round(100 * dataPlus/dataTotal);
}
}
public void enterData(int[] nData)
{
this.nData = nData;
prepareData();
repaint();
}
}
[EMAIL][/EMAIL]