Codeteilung -> Canvas zeichnet nicht mehr

Status
Nicht offen für weitere Antworten.

michi2

Bekanntes Mitglied
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:
Code:
   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()
         {
...

Code:
//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:
Code:
m_malflaeche.paintfunk();

Braucht ihr mehr Code?

Michi
 
Code:
      // 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(); 
         }
 
Irrtum:
Code:
      // 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());
         }
 
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:
Code:
         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 :?
 
Hallo,
Gibt es eine NullPointerException aus?
Code:
//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.
 
Ach, sorry.
ich habe übersehen, dass du ihn schon im Konstruktor initialisiert hast.
 
Oh!
Hab gerade gemerkt das es nur mit dem Nicht Logarithmischen Koordinaten-syystem nicht geht! Das sollte die Fehler suche einschrenken!
 
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.
 
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.
 
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.
 
@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...
 
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
 
Kann bitte jemand helfen, fahre morgen in den Urlaub und will das Programm vorher noch hoch laden.
 
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
 
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:
 
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.
 
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:
 
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.
 
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?
 
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]
 
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 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.
 
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:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben