# Codeteilung -> Canvas zeichnet nicht mehr



## michi2 (29. Jul 2006)

Hallo,
Ich wollte mein Programm auf merdere Dateien teilen, seitdem zeichnet die Canvas jedoch nicht mehr!
Ich verstehe nicht warum!
Habt ihr ne Idee?

Ein paar Code-Stücke:

```
class CMeineCanvas extends Canvas
      {
      nLogCoordinateSystem NotLogSys;
      sLogCoordinateSystem SimpleLogSys;
      dLogCoordinateSystem DualLogSys;
      Graphics g;

      public void update(Graphics g)
         {
         paint(g);
         }
      public void paint( Graphics g )
         {
         g.drawImage( CFunkPlotter2.FP.image, 0, 0, this );
         }
      
      CMeineCanvas()
         {
         // den Hintergrund auf schwarz setzen
         setBackground(Color.black);
         // Vordergrund (=ZeichenFarbe) auf blau setzen
         setForeground(Color.green);
         }
      
      // Die wichtigste Methode: hier wird gezeichnet!
      public void paintfunk()
         {
...
```


```
//Die Haupt klasse
public class CFunkPlotter2 extends JFrame
   {
...

   CMeineCanvas m_malflaeche;	//Die Zeichenfläche
   Image image = new BufferedImage((int) di.getWidth(), (int) di.getHeight(), BufferedImage.TYPE_INT_RGB);
   
   public static CFunkPlotter2 FP =  new CFunkPlotter2("Funktionenplotter");
   
   public static void main(String[] args)
      {
      //Koordinatensystem zeichnen
      FP.m_malflaeche.paintfunk();
      FP.pack();
      //FP.setSize(650,750);
      FP.setResizable(true);
      FP.show();
      }
   
   // Im Konstruktor werden die Canvas-Malfläche und 
   // Schalter zur Auswahl der Funktionen angelegt
   CFunkPlotter2(String titel)
      {
      super(titel);
      
      // Einen Layout Manager einrichten
      getContentPane().setLayout(new FlowLayout());
      
      // Die Malfläche aufnehmen
      m_malflaeche = new CMeineCanvas();
      getContentPane().add(m_malflaeche);
...
```

Neu gezeichnet wird mit:

```
m_malflaeche.paintfunk();
```

Braucht ihr mehr Code?

Michi


----------



## foobar (29. Jul 2006)

Hast du mal getraced?


----------



## michi2 (29. Jul 2006)

Nö, ehrlich gesagt weiß ich aber auch nicht was das ist...


----------



## michi2 (30. Jul 2006)

Gelöscht, um die übersichtlichkeit zu erhalten


----------



## Wildcard (30. Jul 2006)

poste mal paintfunk() ...


----------



## michi2 (30. Jul 2006)

```
// Die wichtigste Methode: hier wird gezeichnet!
      public void paintfunk()
         {
         int w = CFunkPlotter2.FP.w;
         w++;
         if(w>CFunkPlotter2.FP.Farbe.length-1)
            {
            w=0;
            }
         //Graphics erzeugen
         g = CFunkPlotter2.FP.image.getGraphics();
         if(!CFunkPlotter2.FP.cb1.isSelected())
            {
            g.clearRect(0,0,(int) CFunkPlotter2.FP.di.getWidth(),(int) CFunkPlotter2.FP.di.getHeight());
            CFunkPlotter2.FP.werte.setText("");
            w=0;
            }
         
         
         switch ( CFunkPlotter2.FP.CoordinateType)
            {
            case 'n':
            NotLogSys = new nLogCoordinateSystem( CFunkPlotter2.FP, w);
            g = NotLogSys.paintCoordinateSystem(g);
            break;

            case 's':
            SimpleLogSys = new sLogCoordinateSystem( CFunkPlotter2.FP, w);
            g = SimpleLogSys.paintCoordinateSystem(g);
            break;

            case 'd':
            DualLogSys = new dLogCoordinateSystem( CFunkPlotter2.FP, w);
            g = DualLogSys.paintCoordinateSystem(g);
            break;

            default:
            System.out.println("Es scheint das sich hier ein Fehler eingeschlichen hat.\n Bitte informieren sie mich: über [url]http://www.schoenitzer.de\n[/url] Vielen Dank!");
            }
         
         // Wenn keine Funktion ausgewählt ist, nichts tun
         if( CFunkPlotter2.FP.aktFunktion == 0)
            return;
	 double[] para = CFunkPlotter2.FP.getParams();
	 if(para == null)
	    return;
         Funk f = new Funk(para);
         f.funk =  CFunkPlotter2.FP.aktFunktion;
         CFunkPlotter2.FP.werte.append(f.beschreibung()+"\n");
         if(!Double.isNaN(f.yWert(0)) && !Double.isInfinite(f.yWert(0)))
            CFunkPlotter2.FP.werte.append("Schnittpunkt mit der y-Achse bei y = "+Math.rint(f.yWert(0)*1000)/1000+"\n");
         else
         CFunkPlotter2.FP.werte.append("Kein Schnittpunkt mit der y-Achse!\n");
         
         switch ( CFunkPlotter2.FP.CoordinateType)
            {
            case 'n':
            NotLogSys.paintFunk(f);
            break;
            case 's':
            SimpleLogSys.paintFunk(f);
            break;
            case 'd':
            DualLogSys.paintFunk(f);
            break;
            default:
            System.out.println("Es scheint das sich hier ein Fehler eingeschlichen hat.\n Bitte informieren sie mich: über [url]http://www.schoenitzer.de\n[/url] Vielen Dank!");
            }
         CFunkPlotter2.FP.w = w;
         }
      
      void paintValue(int xpos, int ypos)
         {
         g.fillOval(xpos,ypos,1,1);
         // Das Canvas das Bild neu zeichnen lassen.
         repaint(); 
         }
```


----------



## Wildcard (30. Jul 2006)

Dein Canvas hat keine Größe.
setPreferedSize


----------



## michi2 (30. Jul 2006)

Irrtum:

```
// Diese Methode liefert die minimale Größe der Canvas
      public Dimension getMinimumSize() {
         return CFunkPlotter2.FP.di;
         }
      
      // Die Lieblingsgröße setzen wir auf die Minimalgröße
      public Dimension getPreferredSize() {
         return getMinimumSize();
         //return new Dimension(3*getToolkit().getScreenResolution(),3*getToolkit().getScreenResolution());
         }
```


----------



## michi2 (30. Jul 2006)

Der Komplette Code (ungeteilt und geteilt) habe ich hier:
-> Zweite Seite des Threats


----------



## foobar (30. Jul 2006)

> Nö, ehrlich gesagt weiß ich aber auch nicht was das ist...


Du kannst in jeder IDE Haltepunkte setzen und dann Schritt für Schritt das Programm ablaufen lassen.


----------



## Wildcard (30. Jul 2006)

Ok, ich hab mir die Sache mal angesehen, jedoch relativ schnell wieder aufgegeben, da dein Code völlig wirr ist.
-Deine Einrückung ist falsch
-Du kapselst nicht (alles ausser Konstanten soll private sein und nur über getter/setter zu erreichen)
-warum zeichnest du in ein Bild und nicht direkt in der paint?
-Klassen schreibt man groß, Variablen klein. Packages werden immer klein geschrieben.
-Graphics sollten niemals in einer Member-variablen referenziert werden.
-Anstelle von soetwas:

```
switch ( CFunkPlotter2.FP.CoordinateType)
            {
            case 'n':
            ....
```
verwendet man aussagekräftige Konstanten


tut mir leid, aber das ist mir zu stressig für einen Sonntag. Vieleicht hat ja jemand anders die nerven sich da durchzuwühlen  :?


----------



## michi2 (30. Jul 2006)

Gelöscht, um die übersichtlichkeit zu erhalten


----------



## Guest (30. Jul 2006)

Hallo,
Gibt es eine NullPointerException aus?

```
//Koordinatensystem zeichnen
      FP.m_malflaeche.paintfunk();
```
Wenn es so ist, dann solltest du vor dem Aufruf dieser Methode den member *m_malflaeche* initializieren, denke ich.


----------



## Guest (30. Jul 2006)

Ach, sorry.
ich habe übersehen, dass du ihn schon im Konstruktor initialisiert hast.


----------



## michi2 (30. Jul 2006)

Oh!
Hab gerade gemerkt das es nur mit dem Nicht Logarithmischen Koordinaten-syystem nicht geht! Das sollte die Fehler suche einschrenken!


----------



## foobar (30. Jul 2006)

> forausgesetzt man kann spitze programmieren, benützt den Java-Einrückungs-Stil, versteht und benützt die OOP komplett und überall, schreibt nur perfekte Programme....


Deswegen geben wir dir und anderen Tips, wie sie ihre Programme verbesern können. Was du daraus machst ist deine Sache. Nimm es nicht persönlich, sondern lerne daraus, denn nur so kommst du voran.


----------



## michi2 (30. Jul 2006)

Klar, aber der erste Schritt für eine Ordentlichen Still ist das aufteilen  in verschiedene Dateien und dabei habe ich Probleme!
Und ich wäre dankbar wenn ihr mir helft das zum laufen zu bringen, danach kann ich dan die anderen genannten Dinge Stück für Stück machen.


----------



## foobar (31. Jul 2006)

Was funktioniert denn nicht? Ich hab mit den Code mal angeguckt und es sieht immer noch so wild aus wie dein letztes Programm. Du solltest dir erstmal einen sauberen Programmierstil angewöhnen, sonst kommst du auf keinen grünen Zweig. z.b.

- Klassennamen immer groß und packages immer klein schreiben.
- sprechdene Bezcihner wählen, denn f1 sagt nicht viel aus.
etc.

Ich hab dir beim letzen mal schon viele Tips gegeben, also mach was draus.


----------



## Wildcard (31. Jul 2006)

@michi2

Du siehst das aus der falschen Perspektive. Niemand erwartet von dir perfekt programmieren zu können, aber es ist nunmal so das es sich bei diesem Projekt schon um mehrere hundert Zeilen Code handelt.
Für jemanden der den Code nicht selbst geschrieben hat erfordert es immer einige Zeit sich in soetwas reinzudenken.
Bei dir kommt nunmal aber erschwerend hinzu das alles sehr chaotisch ist (da spielen eben auch solche Dinge wie die Einrückung eine wichtige Rolle die man nun wirklich von jedem erwarten kann, weil das jede billig-IDE autmatisch erledigt) was die erforderliche Zeit vervielfacht.
Keiner von uns wird hier bezahlt, oder erhält eine anders geartete Gegenleistung für unsere Hilfe, insofern solltest du auch verstehen das ich nur wenig Lust habe Sonntags ein bis zwei Stunden in das Umschreiben deiner Klassen zu investieren, nur um sie in einen lesbaren Zustand zu versetzen.
Ich habe dir ja auch viele Punkte genannt an denen du arbeiten musst. Damit machst du es für dich selbst, und auch für andere wesentlich leichter...


----------



## michi2 (3. Aug 2006)

Es ist nur so das ich jemandem versprochen habe das Programm noch diese Woche (am besten wäre Heute gewesen) hoch zu laden, und wollte davor noch den Code teilen um ihn *dann* hier vorzustellen (genau für diese Tipps).
Ich wollte halt die Code-Teilung abschließen bevor ich mich dem anderem widme.

@foobar: das Prog lässt sich ohne Probleme compilieren und starten. Wenn man es, in den Optionen, auf einfach oder doppelt Logaritmisches Koordinaten-System stellt funktioniert es wunderbar. Stellt man es jedoch (wie schon per default) auf 'nicht logarithmisches Koordinatensystem' so bleibt die Canvas schwarz es wird weder das Koordinatensystem noch die Funktion gezeichnet! Es werden keine (sichtbaren) Exceptions ausgegeben.
Mir war es nicht möglich per "System.out.println()" die Fehler quelle zu finden.

Ich habe den Code jetzt noch mal verbessert:
-einheitliches Einrücken (aber noch Allman)
-Einige Namen an gepasst (aber nicht alle)
-viel Kommentar!

*Den Source gibt's hier
Jar gibt's hier*


----------



## michi2 (3. Aug 2006)

Kann bitte jemand helfen, fahre morgen in den Urlaub und will das Programm vorher noch hoch laden.


----------



## Wildcard (3. Aug 2006)

michi2 hat gesagt.:
			
		

> @foobar: das Prog lässt sich ohne Probleme compilieren und starten. Wenn man es, in den Optionen, auf einfach oder doppelt Logaritmisches Koordinaten-System stellt funktioniert es wunderbar. Stellt man es jedoch (wie schon per default) auf 'nicht logarithmisches Koordinatensystem' so bleibt die Canvas schwarz es wird weder das Koordinatensystem noch die Funktion gezeichnet! Es werden keine (sichtbaren) Exceptions ausgegeben.
> Mir war es nicht möglich per "System.out.println()" die Fehler quelle zu finden.
> /quote]
> Wo soll man das den einstellen können? Ich finde nichtmal optionen....  ???:L


----------



## michi2 (3. Aug 2006)

Ich schon, unten links, der Button "Optionen"...  ???:L


----------



## Wildcard (3. Aug 2006)

das kommt davon wenn man keine LayoutManager verwendet  :roll: 
Dein Layout ist überdimensioniert, da die Auflösung meines Notebooks nicht ausreicht um alle Buttons zu sehen...  :bae:


----------



## michi2 (3. Aug 2006)

Gelöscht, um die übersichtlichkeit zu erhalten


----------



## Wildcard (3. Aug 2006)

michi2 hat gesagt.:
			
		

> Schon irgent eine Idee worans liegen könnte?


keine Ahnung... ich kann ja ohne Knopf nichtmal testen


----------



## michi2 (3. Aug 2006)

Ist das ernst gemeint? Wenn ja: brauchts du nich umbedingt, per default ist es ja schon auf 'nicht logarithmisches Koordinatensystem' eingestellt, genau hier tritt der Fehler auf.


----------



## Wildcard (3. Aug 2006)

Schon, nur währe es interessant sich die unterschiede zwischen positiv-, und negativ Fall mit dem Debugger anzusehen.
jetzt muss ich erst noch die GUI umbauen   :autsch:


----------



## michi2 (3. Aug 2006)

Gelöscht, um die übersichtlichkeit zu erhalten


----------



## michi2 (4. Aug 2006)

Komentir halt zum Probieren einfach ein paar Buttons aus...


----------



## Wildcard (4. Aug 2006)

Du musst verschachtelte Layouts verwenden.
GridBagLayout ist kompliziert, kann aber auch sehr viel. Sehr nützlich ist zB auch das BorderLayout.
Ich geb's jetzt übrigens auf. Hab dein Layout so umgestellt das ich zumindest den Optionen Button drücken konnte.
Hab alle Koordinatensysteme ausprobiert.
Der Bildschirm bleibt schwarz...
Die Konsole gibt irgendwas aus das nichtmehr auf den Bildschirm passt:
Schn
Funkt
Schn
Funkt

Du hast übrigens AWT und Swing gemischt, was man unbeding vermeiden sollte.


----------



## michi2 (4. Aug 2006)

Versteh ich nicht! Bei mir geht's nur bei den Nicht-Loogarithmischen nicht.
Bei mir giebt er aber auch nix auf dem Bildschirm aus, wie kann das sein?
Benützt du noch die alte Version (die vom altem Post)? Oder die die ich vorhin später(Seite 2) hochgeladen habe?


----------



## Wildcard (4. Aug 2006)

Die von Seite 2


----------



## michi2 (4. Aug 2006)

Versteh ich nicht...
Ihr seid die einzige Möglichkeit die ich sehe das Prog wieder zum laufen zu bringen, mein Mathe-Lehrer wartet schon drauf! Bitte um Hilfe!
[schild=1 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Hilfe[/schild]


----------



## Wildcard (4. Aug 2006)

Tut mir wirklich leid für dich, aber ich find den Fehler nicht. Das ist einfach zu verrückt. *So zeichnet man in Java einfach nicht.*
Das es überhaupt mal funktioniert hat ist bestenfalls Glück...  :? 
Warum gibst du nicht einfach die Version die noch funktioniert hat ab?
Wenn sich dein Lehrer für den Quellcode interessiert hast du sowieso mit beiden Versionen verloren...sorry


----------



## michi2 (4. Aug 2006)

> Tut mir wirklich leid für dich, aber ich find den Fehler nicht. Das ist einfach zu verrückt. So zeichnet man in Java einfach nicht.


Was meinst du damit?



> Wenn sich dein Lehrer für den Quellcode interessiert hast du sowieso mit beiden Versionen verloren...sorry


Nö, das interresiert ihn nicht, aber mich, und euch!


----------



## Wildcard (4. Aug 2006)

michi2 hat gesagt.:
			
		

> > Tut mir wirklich leid für dich, aber ich find den Fehler nicht. Das ist einfach zu verrückt. So zeichnet man in Java einfach nicht.
> 
> 
> Was meinst du damit?


Regeln für das Zeichnen in Java (zumindest solange man noch nicht weiß was man tut :wink  :
1. nur paintComponent überschreiben
2. super.paintComponent() als erster Aufruf.
3. gezeichnet wird ausschließlich in paintComponent
4. keine Logik in paintComponent, sondern nur abbilden eines vorhandenen Models
5. NIEMALS getGraphics aufrufen
6. NIEMALS ein graphics Objekt speichern
7. neuzeichnen nur über repaint()

Na umso besser wenn er sich nicht dafür interesiert. Gib ihm einfach die alte Version.
Danach drückst du am besten den großen Löschknopf und schreibst alles nochmal neu, diesmal aber OOP.
Wenn du dir unsicher bist wie das aussehen soll helfen wir dir auch gerne dabei.


----------



## michi2 (4. Aug 2006)

> Wenn du dir unsicher bist wie das aussehen soll helfen wir dir auch gerne dabei.


Na dan leg mal los, ich hab nähmlich von der Liste fast nix verstanden.


----------



## Wildcard (4. Aug 2006)

Die basics solltest du vieleicht in einem Tutorial, oder auch hier im Forum nachlesen, da gibt's reichlich Material das die Thematik wesentlich ausführlicher erklärt als ich das hier könnte  :wink:


----------



## michi2 (4. Aug 2006)

Das merkwürdige ist, das mir der Weg den ich gegangen bin hier empfohlen wurde... :?  ???:L


----------



## Wildcard (4. Aug 2006)

Wer gab dir die Empfehlung? Vieleicht kann dir derjenige mit deinem Prog weiterhelfen...


----------

