Component vom einem Panel löschen ?

Status
Nicht offen für weitere Antworten.

kaper28

Bekanntes Mitglied
Hallo freunde ,

Mein problem ist ist möchte einen Keis zeichnen auf einem Panel , dann es löschen danach einen größern zeichen u.s.w

Wie kann dieses Kreis denn von dem Panel löshen ? mit repaint() etwa ?
 
ich habe mir es so gedacht ?

Code:
g.drawOval(100,100,150,150);

component löschen ...

g.drawOval(100,100,200,200);

component löschen

g.drawOval(100,100,250,250);

u.s.w

nur wie kann ich es löschen ?
 
Wenn du den Kreis RICHTIG zeichnest, ist die richtige Lösung: Ihn nicht mehr zeichnen werden (Futur 1) und repaint() aufrufen.

Code:
class Foo extends JPanel
{
    Kreis kreis = new Kreis(100,100,50);

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (kreis != null) kreis.maleAuf(g);
    }

    public void dontDrawItAnymore()
    {
        kreis = null;
        repaint();
    }
}
 
(Btw.: wenn du sagst Component von einem JPanel löschen, wäre das eigentlich was anderes aber dem Code nach erbt Kreis ja nicht von Component...)
 
Erst sagst du, bevor du einen neuen malst muss der alte weg,
und jetzt willst du mehrere malen?
Beschreibe doch einfach mal, was es werden soll,
ohne darauf einzugehen, wie man es verwirklichen könnte.
 
Marcos Beispiel mit meheren Kreisen:
Code:
class Foo extends JPanel
{
    List<Kreis> kreise = new ArrayList<Kreis>();

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for(Kreis kreis:kreise) {
           kreis.maleAuf(g);
        } 
    }

    public void addKreis(Kreis kreis)
    {
        kreise.add(kreis);
        repaint();
    }

    public void removeKreis(Kreis kreis)
    {
        kreise.remove(kreis);
        repaint();
    }

}

[edit]Komme mir schon vor wie im Kreissaal...[/edit]
 
André Uhres hat gesagt.:
Erst sagst du, bevor du einen neuen malst muss der alte weg,
und jetzt willst du mehrere malen?
Beschreibe doch einfach mal, was es werden soll,
ohne darauf einzugehen, wie man es verwirklichen könnte.

Andre, ich will einen Kreis zeichnen und löschen und einen größeren zeichen und löschen noch einen größeren zeichen u.s w . Das Kreis soll von innen nach außen größer werden immer .Wenn ich das mit einem timer verbinde der mit gezielten abstand zeichnet dann zieht wie eine animation . Der Kreis wir dann immer größer und größer . Durch diesen timer wiederholung hat man den eindruck der Kreis werde immer weiter vergrößert.
 
Wir können den Kreis mit drei Variablen zeichnen: x, y und d (Durchmesser).
Code:
g.drawOval(x, y, d, d);
Im Timer brauchen wir dann nur die Variablen anzupassen und repaint aufzurufen.
Der Aufruf von super.paintComponent(g) sorgt dafür, daß das Bild vor dem Neuzeichnen bereinigt wird:
Code:
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawOval(x, y, d, d);
}
Der Timer könnte etwa so aussehen:
Code:
public void startAnimation() {
    javax.swing.Timer timer = new javax.swing.Timer(50, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (d == 0 || d > 200) {
                x = 150;
                y = 150;
                d = 10;
            } else {
                d += 2;
                x -= 1;
                y -= 1;
            }
            repaint();
        }
    });
    timer.start();
}
 
Code:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;

class Foo extends JPanel { 

public int d=1;
public int x,y;
	

	public void startAnimation() { 
	    javax.swing.Timer timer = new javax.swing.Timer(500, new ActionListener() { 
	    	
	        @Override 
	        public void actionPerformed(ActionEvent e) { 
	            if ( d == 0 || d > 200) { 
	                 x = 150; 
	                y = 150; 
	                d = 10; 
	            } else { 
	                d += 2; 
	                 x -= 1; 
	                y -= 1; 
	            } 
	            repaint(); 
	        }

			
	    });
	    timer.start(); 
	}
	    protected void paintComponent(Graphics g) { 
		    super.paintComponent(g); 
	    g.drawOval(x, y,d,d); 
	
	}
	
	
	
}

so ich habe das code so erstellt wie du es gesagt hast nur ich bekomme keine zeichnung
 
Wenn du selbstständig d=1 und das delay auf 500 setzt (OHNE SELBSTSTÄNDIG NACHZUDENKEN WAS DAS ZUR FOLGE HAT!!!) darfst du nicht so ungeduldig sein....
 
Wenn keine Zeichnung kommt, dann ist die Klasse falsch integriert.
Möglicherweise hast du die Animation gar nicht gestartet. Versuch's mal so:
Code:
import javax.swing.*;
public class FooTest {
    public static void main(final String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(400, 300);
        Foo panel = new Foo();
        f.add(panel);
        panel.startAnimation();
        f.setVisible(true);
    }
}
Ansonsten trifft das zu, was Marco13 sagte.
 
Marco13 hat gesagt.:
Wenn du selbstständig d=1 und das delay auf 500 setzt (OHNE SELBSTSTÄNDIG NACHZUDENKEN WAS DAS ZUR FOLGE HAT!!!) darfst du nicht so ungeduldig sein....

das war ich nicht, war ein kollege ...... aber ich habe verstanden was das problem war . Ich habe d auf ein gesetzt obwohl d keine festen wert hat.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben