Graphic übermalt Fensterinhalt, soll sie aber nicht!



  • Moin, ich lerne gerade Java und habe ein Problem bei einer Übungsaufgabe. Eine Klasse (abgeleitet von Frame) soll 5 Instanzen einer Klasse Ring erzeugen (Olympische Ringe), die jeweils andere Farben haben und sich selber malen. Leider ist immer nur der Ring zu sehen, der zu letzt gemalt wurde, scheinbar werden die anderen immer übermalt oder keine Ahnung was.

    Weiß wer, woran es liegen kann? 😕



  • Haben die Ringe vielleicht die selben Koordinaten? 😃



  • wird bei jedem zeichnen erst das Bild "neu" gemacht, also mit z.b. einem weißen hintergrund versehen?



  • Nein, aber sie werden nach einander gemalt, ein Objekt der Klasse Ring wird erzeugt und dem Frame geadded, wodurch sich der Ring im Frame malt, an Koordinaten, die dem Konstruktor als Argumente übergeben werden. DANN wird der nächste Ring erzeugt, der wieder dem Frame geadded wird usw, bis alle 5 Ringe erzeugt wurden. Kommentiere ich den letzten Ring aus sehe ich nur den vorletzten, usw.



  • LeGan, genau, ich denke genau das ist das Problem. Wie kann ich das neuzeichnen des weißen Hintergrundes verhindern? Mit wxWidgets unter C++ war das irgendwie einfacher, wenn man keine Allergie gegen Zeiger und Devices hat.



  • HI,

    also ich weiß ja nicht, wie Ring dir den Kreis zeichnet.

    Ring dürfte nur sowas enthalten: Graphics.drawOval(x, y, w, h);

    Dann wird dieser Kreis auf das aktuelle Bildchen gemalt. Was ich mir vorstellen könnte, wäre, dass da noch irgendwas wie Graphics.clearArea(x, y, w, h); o.ä. steht. Genaueres kann man am bsten sagen, wenn wir den code kennen würden...



  • Der Quelltext sah etwa so aus(aus Gedächnis, Quellcode ist auf enderem Rechner):

    [/code]
    import java.asw.;
    import jave.asw.event.
    ;

    class Ring extends Canvas
    {
    Color farbe;
    int posX;
    int posY;
    int size;

    Ring( Color f, int x, int y, int s )
    {
    farbe=f;
    posX=x;
    posY=y;
    size=s;
    }

    paint( Graphics g )
    {
    // Hier tritt der Fehler vermutlich auf
    g.setColor(farbe);
    g.setAngle(posX, posY, size, size, 0, 360);
    }
    }

    class OlympicRings extends Frame
    {
    OlympicRings()
    {
    add("Center, new Ring(Color.red, 100, 100, 100);
    add("Center, new Ring(Color.black, 180, 100, 100);
    add("Center, new Ring(Color.blue, 260, 100, 100);
    add("Center, new Ring(Color.yellow, 140, 180, 100);
    add("Center, new Ring(Color.green, 220, 180, 100);

    // Hier fehlt noch ein Eintrag, der dafür sorgt, dass das Programm
    // beim Schließen des Fensters beendet wird. Steht im Programm,
    // funktioniert, bekomme ich aber aus dem Kopf nichtmehr zusammen

    setTitle("Olympische Ringe");
    setSize(400, 300);
    setVisible(true);
    }

    public static void main( string[] args )
    {
    new OlympicRings();
    }
    }



  • Wenn ich das richtig sehe, fügst du5 mal hintereinander an die selbe position ein Ring-Objekt in das Fenster ein. Dadurch wird nur das letzte sichtbar!

    Du müsstest das so machen, dass alle Ringe mit dem selben Graphics-objekt gezeichnet werden.


Anmelden zum Antworten