# Kuchendiagramm - mit paintComponent nach JButton druck zeich



## tylerdurdn (18. Jan 2007)

Hallo,

meine Aufgabe ist es ein Kuchendiagramm zu zeichnen, dem ich per TextFeld werte uebergebe, die dann unterschiedlich gefaerbt im Diagramm erscheinen.

exakte Aufgabenstellung siehe:        http://www.animanet.net/ss05.pdf

Bisher habe ich:

1. Eine klasse in der das Diagramm gezeichnet wird. (abgeleitet von JPanel)                             <- DPanel.java
2. Eine klasse in der das Textfeld und Labels zu finden sind. (abgeleitet von JPanel)                   <- FPanel.java
3. Eine klasse in der der "Erstellen" und "Beenden" button drin sind. (abgeleitet von JPanel)       <- BPanel.java
4. Eine klasse, die den ActionListener implemetiert                                                                   <-Wache.java
5. Eine klasse SimpleFrame (abgeleitet von JFrame)                                                                <-SimpleFrame.java
6. Eine klasse KFrame (abgeleitet von SimpleFrame) zum einfuegen der oben genannten Klassen <-KFrame.java
7. Eine klasse Farbschema zumfestlegen der Farben des Diagramms                                        <-Farbschema.java

mein Problem:
So wie ich das sehe muesste man in der Klasse Wache (in actionPerformed) die methode 
*paintComponent* aufrufen und ihr werte fuer  
*fillArc(x-wert ,y-wert, breite, hoehe, anfangswinkel, endewinkel)* <- die die einzelnen farbigen kreissegmente zeichnen uebergeben.
bzw muesste fillArc fuer jedes Kreissegment erneut aufgerufen werden.
Ich habe keinen plan wie das gehen soll?, meine bisherigen Versuche scheiterten klaeglich.

Hoffe mir kann jemand die Herangehensweise erklaeren, oder mir anhand eines Funktionierenden Beispiels zeigen wies geht. (Das wird leider bald abgeprueft).

Hier der Quelltext der einzelnen Klassen:

*Danke schon mal an alle,die sich die Muehe gemacht haben bis heirher zu lesen*

1. DPanel.java

```
import javax.swing.*;
import java.awt.*;
public class DPanel extends JPanel{
	int x,y,b,h,startw,delta;
	public Farbschema fs = new Farbschema();
	boolean paintIt = false;
	public DPanel(int x, int y, int b, int h, int startw, int delta){
		setBackground(Color.white);
		this.x=x;
		this.y=y;
		this.b=b;
		this.h=h;
		this.startw=startw;
		this.delta=delta;
	}
	public void zeichnen(Graphics g, int x, int y){
		
	
	public void paintComponent (Graphics g){
		super.paintComponent (g);
		g.setColor(Color.blue);
		g.fillArc(x,y,b,h,startw,delta);
	}
}
```
2. FPanel.java

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FPanel extends JPanel{
	
	JLabel datenJl;
	JTextField eingabeJtf;
	JLabel leerJl;
	public FPanel(){
		
		//setPreferredSize(new Dimension(600,200));
		datenJl = new JLabel("Daten:");
		eingabeJtf = new JTextField("");
		leerJl = new JLabel("");
	
		//getContentPane(). wieso meckert er wenn ich getContentPane(). davorsetze?? was macht das noch mal genau?
		setLayout(new GridLayout (3,1));
		add(datenJl);
		add(eingabeJtf);
		add(leerJl);		
	}
}
```
3. BPanel.java

```
import java.awt.*;
import javax.swing.*;

public class BPanel extends JPanel{
	JButton eb;
	JButton bb;
	
	public BPanel(){
		setLayout(new GridLayout(1,2));
		//setPreferredSize(new Dimension(400,100));
		eb = new JButton("Erstellen");
		bb = new JButton("Beenden");
		add(eb);
		add(bb);
	}
}
```
4. Wache.java

```
import java.awt.event.*;
import java.util.*;

public class Wache implements ActionListener{
	
	private FPanel fp = new FPanel();
	private DPanel dp = new DPanel();
	private BPanel bp = new BPanel();
	public Wache(DPanel dp, FPanel fp){
		this.fp = fp;
		this.dp = dp;
	}
	
	public void actionPerformed(ActionEvent evt){
		if (evt.getActionCommand()=="Erstellen"){
			String values = fp.eingabeJtf.getText();
			 System.out.println("was"+values);
			 StringTokenizer st = new StringTokenizer(values);
			while (st.hasMoreTokens()) {
				System.out.println(st.nextToken());
		     }
		}
		if (evt.getActionCommand()=="Beenden"){
			 System.exit(0);
		}
	}
}
```
5. SimpleFrame.java

```
import java.awt.event.*;
import javax.swing.*;

public class SimpleFrame extends JFrame
{ 

  public SimpleFrame(){
     setSize(400,500);
     addWindowListener(new WindowAdapter()
         { public void windowClosing(WindowEvent e)
          {
            System.exit(0);
          }

         });
  }

  public void showIt(){
    setVisible(true);
  }

  public void showIt(String title){
    setTitle(title);
    setVisible(true);
  }
 public void showIt(String title,int x, int y){
    setTitle(title);
    setLocation(x,y);
    setVisible(true);
  }

  public void hideIt(){
    setVisible(false);
  }

}
```
6. KFrame.java

```
import java.awt.*;
import javax.swing.*;

public class KFrame extends SimpleFrame{
	public DPanel dp;
	public FPanel fp;
	public BPanel bp;
	
	public KFrame(){
		dp = new DPanel();
		fp = new FPanel();
		bp = new BPanel();
		
		Wache w = new Wache(dp, fp);
        bp.eb.addActionListener(w);
		bp.bb.addActionListener(w);
		
		
		//bp.setPreferredSize(new Dimension(400,100));
		getContentPane().setLayout(new GridLayout(3,1));
		getContentPane().add(dp);
		getContentPane().add(fp);
		getContentPane().add(bp);
		
	}
}
```
7. Farbschema.java

```
import java.awt.Color;
public class Farbschema{
	private Color[] schema;
	public Farbschema(){
		schema=new Color [8];
		schema[0]=Color.red;
		schema[1]=Color.blue;
		schema[2]=Color.green;
		schema[3]=Color.yellow;
		schema[4]=Color.cyan;
		schema[5]=Color.magenta;
		schema[6]=Color.black;
		schema[7]=Color.pink;
	}
	Color getColor(int farbIndex){
		int anz=schema.length;
		int pos=farbIndex%anz;
		return schema[pos];
	}
}
```
8. Test.java   <- die Testklasse (zum testen des ganzen)

```
public class Test {
	KFrame kf;
	public Test(){
		 kf = new KFrame();
		 kf.showIt();
	}
	public static void main (String [] args){
		Test t= new Test();
	}
}
```
*Respekt an alle,die bis hierher gelesen haben*


----------



## tylerdurdn (18. Jan 2007)

Leute, bitte helft mir, ihr braucht ja gar nicht den ganzen Quelltext zu lesen.
*Ich habe eigentlich nur eine Frage:*

*Wie kann ich meiner paintComponent (siehe unten) Methode nachdem der button gedrueckt wurde Parameter für fillArc uebergeben???*


```
public void paintComponent (Graphics g){
		super.paintComponent (g);
		g.setColor(Color.blue);
		g.fillArc(x,y,b,h,startw,delta);
	}
```


----------



## L-ectron-X (19. Jan 2007)

Du legst globale (private) Instanzvariablen dafür an. Diese können von jeder Methode in der Klasse beschrieben und von jeder Methode der Klasse gelesen werden.
Bei einem Button-Klick schreibst du die Werte in die Variablen und löst ein Repaint aus.
Die paintComponent()-Methode zeichnet dann automatisch mit den Instanzvariablen.


----------



## tylerdurdn (13. Feb 2007)

Danke fuer die Hilfe L-ectron-X,

nach dem ersten blackout habe ich die Sache einfach über den Haufen geschmissen,und noch mal neu angefangen.
Und *es geht* soweit.

Ich hab nun 5 Klassen:

1.) SimpleFrame (extends JFrame)
2.) BFrame (extens SimpleFrame)
3.) Farbschema (legt die Farben der Diagrammteile fest)
4.) DPanel (liefert das Panel auf dem das Diagramm gezeichnet wird. Zeichnet Kreis- Balken- und Saeulendiagramme)
5.) Test (eine einfache Testklasse)

SimpleFrame


```
import java.awt.event.*;
import javax.swing.*;

public class SimpleFrame extends JFrame
{ 

  public SimpleFrame(){
     setSize(300,430);
     addWindowListener(new WindowAdapter()
         { public void windowClosing(WindowEvent e)
          {
            System.exit(0);
          }

         });
  }

  public void showIt(){
    setVisible(true);
  }

  public void showIt(String title){
    setTitle(title);
    setVisible(true);
  }
 public void showIt(String title,int x, int y){
    setTitle(title);
    setLocation(x,y);
    setVisible(true);
  }

  public void hideIt(){
    setVisible(false);
  }

}
```

BFrame

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class BFrame extends SimpleFrame{
	int a;
	DPanel dp;
	JMenuBar jmb = new JMenuBar();
	JMenu jm = new JMenu("Diagramtyp");
	JMenuItem Balken = new JMenuItem ("Balkendiagram");
	JMenuItem Kreis = new JMenuItem ("Kreisdiagram");
	JMenuItem Saeulen = new JMenuItem ("Säulendiagram");
	MenuWache mWache = new MenuWache();
	public BFrame(){
	dp = new DPanel(getContentPane(),new Farbschema());
	setJMenuBar(jmb);
	jmb.add(jm);
	Balken.addActionListener(mWache);
	Kreis.addActionListener(mWache);
	Saeulen.addActionListener(mWache);
	jm.add(Balken);
	jm.add(Kreis);
	jm.add(Saeulen);
    setSize(300,300);
    
    setTitle("Diagramm");
    showIt();
  }
  public class MenuWache implements ActionListener{
    	public void actionPerformed(ActionEvent evt){
			if (evt.getActionCommand()=="Balkendiagram") dp.auswahl=1;
			if (evt.getActionCommand()=="Kreisdiagram") dp.auswahl=2;
			if (evt.getActionCommand()=="Säulendiagram") dp.auswahl=3;
			dp.repaint();
			System.out.println("Menuactin"+a);
		}
  }
}
```

Farbschema

```
import java.awt.Color;
public class Farbschema{
	private Color[] schema;
	public Farbschema(){
		schema=new Color [8];
		schema[0]=Color.red;
		schema[1]=Color.blue;
		schema[2]=Color.green;
		schema[3]=Color.yellow;
		schema[4]=Color.cyan;
		schema[5]=Color.magenta;
		schema[6]=Color.black;
		schema[7]=Color.pink;
	}
	Color getColor(int farbIndex){
		int anz=schema.length;
		int pos=farbIndex%anz;
		return schema[pos];
	}
}
```

DPanel

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.lang.String.*;

public class DPanel extends JPanel{
    int auswahl=2;
    int cnt;										//zählt die Farben durch
    JPanel jp1;
    JLabel dl;
    JTextField tf;
    JLabel ll;
    JPanel jp2;
    JButton eb;
    JButton bb;
    private Farbschema fs;
    Wache w = new Wache();
    public DPanel(Container c, Farbschema fs){
		//Container c=getContentPane()						//getContentPane()
        this.fs=fs;
        setBackground(Color.white);					//Hintergrund
        jp1 = new JPanel();
        dl = new JLabel("Daten:");
        tf = new JTextField("");
        ll = new JLabel("");
        jp1.setLayout(new GridLayout(4,1));			//Layout des Panels
        jp1.add(dl);
        jp1.add(tf);
        jp1.add(ll);
        jp2 = new JPanel();
        eb = new JButton("Erstellen");
        eb.addActionListener(w);
        bb = new JButton("Beenden");
		bb.addActionListener(w);
        jp2.setLayout(new GridLayout(1,2));			//Layout des Panels
        jp2.add(eb);
        jp2.add(bb);
        jp1.add(jp2);
        c.add(this,"Center");
        c.add(jp1,"South");
		
    }
    public void paintComponent(Graphics g){			//paintComponent
        super.paintComponent(g);
		if (auswahl==1){							// Balkendiagramm
			int xanf=0;
			int xanfint;
			
			int xlint;
			double xlaenger;
			
			int y=0;
			int w = getWidth();
			double wdouble = (new Integer(w)).doubleValue();
			
			double db=0;
			int in =0;
			int summe = 0;
			String daten = tf.getText();
			StringTokenizer st = new StringTokenizer(daten,",");
			while (st.hasMoreTokens()) {		//Zuerst separat die Summe aus allen Tokens berechnen
				String s=st.nextToken();
				db = (new Double(s)).doubleValue();
				in = (new Double(db)).intValue();
				summe +=in;
			}
	
			st=new StringTokenizer(daten,",");	//der StringTokenizer muß vor jeder neuen Verwendung neu gefüllt werden
			cnt=0;
			while (st.hasMoreTokens()) {
				String s=st.nextToken();
				db = (new Double(s)).doubleValue();
				xlaenger=(wdouble/summe)*db; //einzelne Schrittweite des Balkenelements
			
				xanfint = (new Double(xanf)).intValue();
				xlint = (new Double(xlaenger)).intValue();
				g.setColor(fs.getColor(cnt));
				System.out.println("xanfint"+xanfint);
				System.out.println("xlint"+xlint);
				g.fillRect(xanfint,y,xlint,40);
				xanf+=xlaenger;
				
				cnt++;
			}
		}
		if (auswahl==2){							//Kreisdiagramm
			int a=0;
			int d;
			int x;
			int y = 0;
	        int w = getWidth();
			int h = getHeight();
			x = (w-h)/2;

			String daten = tf.getText();
			StringTokenizer st = new StringTokenizer(daten,",");
			int cntTokens= st.countTokens();
			System.out.println("Counttokens: "+cntTokens);
			int []anz;
			int indegree;
			anz = new int[cntTokens];//
			double db=0;
			int in=0;
			int summe=0;
			while (st.hasMoreTokens()) {			//einfache berechnung der Summe aller Tokens
				String s=st.nextToken();
				db = (new Double(s)).doubleValue();
				in = (new Double(db)).intValue();
				summe +=in;
			}
			cnt=0;
			st=new StringTokenizer(daten,",");
			while (st.hasMoreTokens()) {
				String s=st.nextToken();
				db = (new Double(s)).doubleValue();
				in = (new Double(db)).intValue();

				System.out.println("2.whileschleife--"+s);////
				double dummy=(360.0/summe)*in;
				indegree=(new Double(dummy)).intValue();
				anz[cnt]=indegree;
				if (cnt==0){
					a=0;
					d=anz[cnt];
				}
				else{
					a+=anz[cnt-1];
					d=anz[cnt];
				}
				
				g.setColor(fs.getColor(cnt));
				g.fillArc(x,y,h,h,a,d);
				
				cnt++;
			}
		}
		if (auswahl==3){							//Säulendiagramm
        int x;
		int xWeite=0;
        int y;
        int w = getWidth();
        int h = getHeight();
        
        String daten = tf.getText();
        StringTokenizer st = new StringTokenizer(daten,",");
        cnt = 0;
        int cntTokens= st.countTokens();
		x=0;
		double hDouble = (new Double(h)).doubleValue();
        double db=0;
        double summe=0;
		
        while (st.hasMoreTokens()) {
            xWeite=w/cntTokens;
			String s=st.nextToken();
            db = (new Double(s)).doubleValue();	
			summe +=db;
        }
        st=new StringTokenizer(daten,",");
        while (st.hasMoreTokens()) {
            String s=st.nextToken();
            db = (new Double(s)).doubleValue();
			double eineBalkenlaenge=(hDouble/summe)*db;
			int Balkenlaenge = (new Double(eineBalkenlaenge)).intValue();
            
            if (cnt==0){
                x=0;
                y=h-Balkenlaenge;
            }
            else{
                x+=xWeite;
                y=h-Balkenlaenge;
            }
            g.setColor(fs.getColor(cnt));
			g.fillRect(x,y,xWeite,Balkenlaenge);

            cnt++;
        }
	}
		
		System.out.println("Auswahl: "+auswahl);
    }
    public class Wache implements ActionListener{
        public void actionPerformed(ActionEvent evt){
			if (evt.getActionCommand()=="Erstellen") repaint();		//Neuzeichnen
            if (evt.getActionCommand()=="Beenden") System.exit(0);	//Beenden
        }
    }

}
```

Test

```
public class Test {
	BFrame bf;
	public Test(){
		 bf = new BFrame();
	}
	public static void main (String [] args){
		Test t= new Test();
	}
}
```

Das Programm funktioniert nun.


----------



## Gast (13. Feb 2007)

kleiner tipp:
jfreechart hat schon schöne kuchendiagramme


----------

