Java treibt mich in den Wahnsinn...

  • Hallo ! Ich habe hier ein Problem mit einem meiner Java-Programme.

    Ich habe eine Methode in einer Klasse, mit dem Namen zeichne.

    Zitat


    public void zeichne (Graphics g){
    [...]
    g.drawPolygon(X_Coords,Y_Coords,n);
    [...]

    Jetzt möchte ich innerhalb der Klasse eine zweite Methode schreiben die unteranderem , wenn sie aufgerufen wird, auch die zeichne-Methode ausführt.
    Wie stelle ich das an ?

    Eine einfacher zeichne(g); funktioniert nicht.

    Grüße,

    Easter

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • In der zeichne-Methode werden einigen komplexe Berechnungen etc. durchgeführt und die Ergebnis-Koordinaten in ein Array gepackt und dann das Polygon erzeugt.

    Jetzt möchte ich eine Pseudo-Lösche Methode schreiben, die die Farbe auf schwarz setzt, und das gleiche Objekt nocheinmal erzeugt.

    Code
    public void loesche (Graphics g){
    
    Color alteFarbe=farbe;
    farbe= Color.black;
    zeichne(g);
    
    
    farbe=alteFarbe;
    }

    So in etwa. Nur klappt das noch nicht so wie es soll...

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • Woher weiß denn g, dass es den Inhalt irgend einer Variablen als aktuelle Zeichenfarbe benutzen soll?

    Sicherlich musst du nicht nur die bisherige und aktuelle Farbe als Variable verwalten, du musst bestimmt auch dafür sorgen, dass das Grafiksystem g erfährt, dass es ab sofort eine andere Farbe benutzen soll.

    Zumindest kann ich innerhalb deiner lokalen Prozedur nicht erkennen, ob die sich auf irgendwelche globalen Variablen bezieht, deren Deklaration du uns bisher verschwiegen hast. Jedenfalls sind so dermaßen kurze Codeschnipsel reichlich wertlos.

    Globale Variablen sind im Allgemeinen sowieso eine Sache, die leicht zu Verwirrung führt. Die Übergabe als Parameter ist zumindest offensichtlicher.

    Wenn du sonst keine Möglichkeit hast, dann hilft manchmal zumindest, Debugging-Texte per System-Ausgabestream in die Konsole zu schreiben, um immer zu sehen, was wann womit in welcher Reihenfolge ausgeführt wurde. Zumindest wenn du keinen Schritt-für-Schritt-Debugger verwenden kannst.

  • Ich seh das so wie LigH: Kannst du mal die komplette Klasse posten oder anhängen?
    Oder noch besser ein Eclipse-Projekt. ;)

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Ich glaube, ich habe dein Problem nicht wirklich verstanden. Vielleicht hilft dir das weiter: Du kannst in der Klasse Zeichnungen eine weitere Methode paint2() implementieren:

    PHP
    public void paint2(Graphics g){
        this.setBackground(Color.blue);
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        nEck meinPolygon2 = new nEck (150,150,100,3,Color.yellow,false,true,60,true);
        meinPolygon2.zeichne(g);
    }

    Die kannst du nun zum Beispiel in der Methode paint() aufrufen: paint2(g);

    Ein Problem, das ich festgestellt habe: das nEck meinPolygon wird anscheinend in der Methode meinPolygon.zeichne(g) verändert, es lässt sich nicht zweimal nacheinander zeichnen, deshalb habe ich das Objekt in paint2() nochmal erzeugt (-> meinPolygon2).

    Vielleicht kannst du ja etwas ausführlicher erklären, was du machen willst und wo das Problem ist.

    ich wollte den Sourcecode erst nicht öffentlich posten,

    Hm... ;)

    Dateien

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Also... Kreis Oval etc. erben ihre Methoden von Library, deswegen können diese gelöscht und verschoben werden.

    Jetzt muss aber das Polygon (Klasse nEck) auch gelöscht werden können.
    Dazu will ich in der Klasse nEck eine Methode "loeschen" schreiben.

    Wenn ich jetzt meine loeschen-Methode aus der Library :

    PHP
    public void loesche (Graphics g){Color alteFarbe=farbe;farbe= Color.black;zeichne(g);farbe=alteFarbe;}

    einfach in die Klasse nEck schreibe und in Zeichnung dann folgendes ausführe :

    PHP
    meinPolygon = new nEck (150,150,100,3,Color.yellow,false,true,60,true);
            meinPolygon.zeichne(g);
            pause(3000);
            meinPolygon.loesche(g);

    Dann funktioniert das Löschen nicht. Jetzt ist meien Frage, wie ich die Löschen-Methode in nEck formulierne muss, damit das funzt...

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • Auf jeden Fall sollte man in einer Klasse Datenmanipulation und Darstellung voneinander trennen. Das kann eine Menge an Methoden (auch private) bedeuten, aber es nützt der Übersichtlichkeit. So würde ich z.B. das Vieleck vielleicht als privates Attribut der Klasse deklarieren und in einer Methode erzeugen -- dann ist es einmal erzeugt worden, und kann in den Methoden der Klasse immer wieder verwendet werden (es ist ja "Objekt-global" verfügbar). Mit lokalen Variablen in Methoden gibt es immer das Problem der Lebensdauer, mit globalen Variablen außerhalb der Klasse das Problem der mißachteten "Kapselung" und das eventuell mögliche Überschreiben von verschiedenen Punkten aus.
    __

    Wenn etwas "nicht funktioniert", hilft es bei der Fehlersuche zu erfahren, was denn statt dessen passiert. Einerseits, wie die Grafik danach aussieht - und andererseits, ob denn die Methoden in der erwarteten Reihenfolge abgearbeitet wurden.
    __

    P.S.: Saubere Quelltextformatierung hilft beim Lesen ungemein. Quelltexteinrückung passiert nicht aus Versehen, sondern mit Absicht.

  • Dass die Methode loesche() in der Klasse nEck nicht funktioniert, liegt an dem Problem, das ich oben schon erwähnt habe: das Objekt meinPolygon wird durch meinPolygon.zeichne(g) verändert (was wiederum an der von LigH erwähnten nicht vorhandenen Trennung von Darstellung und Datenmanipulation liegt).

    Wenn du das komplette Fenster wieder schwarz machen willst, wäre es wohl eh sinnvoller das hier zu benutzen: g.clearRect(0, 0, this.getWidth(), this.getHeight());

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Aber warum funktioniert es denn dann, wenn ich in Zeichnugn folgendes eingebe :

    PHP
    meinPolygon = new nEck (150,150,100,3,Color.yellow,false,true,60,true);
            meinPolygon.zeichne(g);
            pause(3000);
            meinPolygon = new nEck (150,150,100,3,Color.black,false,true,60,true);
            meinPolygon.zeichne(g);

    Nichts anderes soll die lösch-Methode ja tuen, die Farbe auf schwarz setzen und das geiche nochmal erzeugen (quasi übermalen).

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • Zeile 1 erzeugt ein Objekt (1) und speichert es in meinPolygon
    Zeile 2 verändert das in meinPolygon gespeicherte Objekt (1')
    Zeile 4 erzeugt wieder ein Objekt (2) (mit den gleichen Eigenschaften wie das von Zeile 1, aber eben ein anderes) und speichert es in meinPolygon (das Objekt, das vorher darin gespeichert war, geht verlorgen -> Garbage Collector)

    Klar?

    Jedes Objekt der Klasse nEck hat die Eigenschaft drehwinkel. Diese Variable veränderst du aber in der Methode zeichne()
    in Zeile 45: drehwinkel = Math.toRadians(drehwinkel);
    in Zeile 99: drehwinkel=0;
    in Zeile 127: drehwinkel=drehwinkel+1;

    Dadurch ist das Objekt (so wie du es kanntest) dann halt futsch. ;)

    Nimm in der Methode zeichne() eine andere Variable, dann müsste es funktionieren.

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Ich habe jetzt ganz am Anfang der zeichne()-Methode geschrieben :

    double tmpdrehwinkel = drehwinkel;

    und ganz am Ende der zeichne()-Methode :

    drehwinkel = tmpdrehwinkel;

    Aber auch das hat nichts gebracht.

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • Ich glaube, du musst erst mal lernen, "Schnürsenkel zu binden" - in Java.

    Das heißt: Du musst zunächst lernen, dir selber zu erklären, was eigentlich passieren soll, bevor du versuchst, es zu programmieren.


    "Schnürsenkel binden" deshalb: Das ist etwas, was du sicher gelernt hast, und jetzt dermaßen beherrschst, dass du nicht mehr drüber nachdenkst, wie das geht. Im Gegenteil: Sobald du anfängst, darüber nachzudenken, wie man eine Schleife bindet, wirst du es nicht mehr können... Nun beschreibe mal jemandem schriftlich, wie das Binden einer Schleife funktioniert. -- Und so tief musst du bei Algorithmen verallgemeinern können, um programmieren zu können. Ein guter Lehrer kann dir das beibringen.

  • Die beiden am Ende der Methode zeichne() lösen das Problem:
    temp2 = 0;
    temp = 0;

    Das ist Chaos pur, was du da mit den Variablen machst.

    Dateien

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Vielen lieben Dank, nexus !

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

  • Gern geschehen. :)

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Hallo Gemeinde !

    Ich habe wieder ein Problem. Eigendlich sollte da ein Pickup bei rauskommen :

    Ich habe bestimmt einen Rechenfehler irgendwo... Könntet ihr mir da auf die Sprünge helfen, bitte ?


    Grüße, Christian.

    [Blockierte Grafik: http://img366.imageshack.us/img366/2482/skizzekz7.png]

    Die Rotation der Erde wurde in den letzten Jahren primär durch sich im Grab umdrehende Musiker angetrieben - Mainstream sei dank.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!