# Histogramm zeichnen mit AWT



## Noon (26. Okt 2008)

Hallo, 

ich sitze gerade an folgender Aufgabe und habe durch die wirre Aufgabenbeschreibung leider gerade den Faden verloren und weiß nicht mehr weiter. 

Die Aufgabe: 



> Programmieren Sie eine Klasse ShowHistogram als Unterklasse der Klasse Frame, die ein PaintHistogram-Objekt beinhaltet und anzeigt.
> 
> Die PaintHistogram-Klasse ist wiederum eine Klasse, die als Unterklasse der Klasse Canvas implementiert wird, in ihrem Konstruktor ein Array mit Zahlen bekommt und folgendes Balkendiagramm innerhalb ihrer paint-Methode zeichnet



Mein Code dazu: 


```
import java.awt.*;


public class ShowHistogramm extends Frame{
	Frame fenster = new Frame();

	
	public static void main(String [] args)
	  {
		  fenster.setTitle("Show Histogramm");
		  fenster.setSize(300,150);
		  fenster.setVisible(true);
	  }
	public ShowHistogramm()
	  {
		ShowHistogramm painthistogramm;
		painthistogramm= new ShowHistogramm();
		
				
		    	  
		  }
	      
	      
}
class PaintHistogramm extends Canvas
{
	public static void main(String[] args)
	{
		
	}
	 private static final long serialVersionUID = 4711L;
	

	public PaintHistogramm(){
		 int [] n = {10,2,3,4,5,6,7,8};
	}
	public void paint( Graphics g )
	  {
		
		for(int i=0;i<11; i++)
		  {   
			  g.setColor( Color.blue );
				g.fillRect( 20, 20, 20, 20 );
				g.setColor( Color.red );
				g.drawRect( 50,50,30,30 );
		  }
	  }}
```

Was ich gerne von euch wissen würde ist, ob ich den grundsätzlichen Aufbau (unterklasse von, methode von usw) richtig habe oder was da falsch ist. Ich weiß, dass dieses Programm so noch gar nix macht, da ich die Funktionen auch noch nicht habe. Ich hätte nur gerne gewusst was falsch ist und warum. Ich weiß ich bin ein Noob, falls ich das gleich gesagt bekomme, aber ich arbeite echt dran, es hinzubekommen als wäre ich für eure Hilfe echt dankbar.


----------



## SlaterB (26. Okt 2008)

PaintHistogramm braucht keine main-Methode

ShowHistogramm erbt von Frame, dann ist ein ShowHistogramm-Objekt das Frame-Objekt,
die Variable 
Frame fenster = new Frame(); 
ist also überflüssig bis hinderlich

von der statischen main-Methode könntest du eh nicht auf das nicht-statische fenster zugreifen,

im ShowHistogramm-Konstruktor ein weiteres ShowHistogramm-Objekt zu erzeugen führt logischerweise zu einer Endlosschleife


ein ShowHistogramm-Objekt wird (ansonsten) bisher nirgendwo erzeugt,


das ShowHistogramm-Frame sollte dann auch ein PaintHistogramm-Objekt enthalten

der Variablenname von
> ShowHistogramm painthistogramm;
deutet wohl darauf hin, also noch zu korrigieren


----------



## Noon (29. Okt 2008)

Ich hab das jetzt mal erweitert und hänge leider schon wieder fest 

Meine ShowHistogramm Klasse sieht jetzt wie folgt aus: 


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

public class ShowHistogramm extends JFrame{
    public ShowHistogramm()
    {
    	 PaintHistogramm p = new PaintHistogramm();
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setSize(400,400);
         this.add(p);
         this.setVisible(true);
         this.setLayout(new GridLayout());
        
        
        Container paintHistogramm = getContentPane();
        
        
    }
    public static void main(String[] args) {
        
        ShowHistogramm ph = new ShowHistogramm();
    }

}
```

Und meine Paint Histogramm Klasse, sieht jetzt so aus: 


```
import java.awt.*;
public class PaintHistogramm extends Canvas{
    
    public void paint(Graphics g){
        
        super.paint(g);
        int x = 50, y = 300;
        int breite = 20, abstand = 5;
        int werteTabelle[]= {3,7,38,5,6,27,45,33,5,10,23,6};
        g.drawLine(x, y, x+12*(breite+abstand), y);
        g.drawLine(x, y, x, 30);
        
        for (int m = 0; m < 12; m++){
            g.drawString(werte[m], m*(breite+abstand)+abstand+x, y+20);
        }
        for (int i = 0; i < y; i+=100){
            g.drawString(String.valueOf(i), 20, y-i);
        
        g.setColor(Color.black);
        }
        for(int wert = 0; wert < 12; wert++)
        { 
        	int a = (int) werteTabelle[wert]*10;
        g.fillRect(wert*(breite+abstand)+abstand+x, y-a, breite, a);
        g.drawRect(wert*(breite+abstand)+abstand+x, y-a, breite, a);
        g.setColor(Color.black);}}
    
        private double[] werteTabelle = new double[12];
        private static String werte[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m"};
}
```

Bekomme immer die Fehlermeldung: "java.lang.NoClassDefFoundError: ShowHistogram
Caused by: java.lang.ClassNotFoundException: ShowHistogram
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Exception in thread "main" "

Kann damit nicht so recht was anfangen. Help?


----------



## SlaterB (30. Okt 2008)

das liegt wahrscheinlich an der Programmausführung,
die andere Klasse wird nicht gefunden, weil der Classpath falsch eingestellt ist,
vielleicht ist die andere Datei auch gar nicht kompiliert,

gib alle verwendeten Verzeichnisse, Entwickungsumgebungen, Classpath-Systemvariablen, Befehle beim Compilieren und Ausführen usw. an,
idealerweise sollte das aber jemand vor Ort klären


----------



## Noon (31. Okt 2008)

Ok, danke dann frage ich mal vor Ort, wenn ich die Aufgabe abgebe.


----------



## SlaterB (31. Okt 2008)

naja, wenn du abgibst, hast du wohl nicht deinen PC dabei,
obwohl es ein Laptop sein könnte,

vielleicht gibts aber ne Vorführung, wie man es richtig macht


----------



## Noon (1. Nov 2008)

Ich habe meinen Laptop dabei, auf dem ich das auch programmiert habe.


----------

