repaint bei canvas aufrufen

Status
Nicht offen für weitere Antworten.

Sir_Steve

Mitglied
Grüße,

ich habe ein unschönes problem:
ich habe ein canvas in dem ich einen Kreis zeichnen will. Das mach ich mit der methode
Code:
paint();

jetzt will ich die paint nochma aufrufen:


Code:
repaint();

Bevor ich paint aufrufe habe ich ein

Code:
System.out.println("PAINT");

erste zeile in paint lautet

Code:
System.out.println("aufgerufen");

Die erste Zeile ("PAINT") gibt er aus, aber dann geht er ned in die paint hinein da er "aufgerufen" nicht ausgibt.
Was muss ich tun, um die Methode aufzurufen?
Übrigens, die Paint Methode wird nichteinmal beim Initialisieren des Canvas aufgerufen...

danke, Steve!
 

Illuvatar

Top Contributor
Die Methode heißt Component#paint (Graphics). Machst du das so?

d.h., die Klasse müsste so aussehen:
Code:
class XYZ extends Canvas
{
  public XYZ()
  {
    System.out.println ("PAINT");
    repaint();
  }
  public void paint (Graphics g)
  {
    System.out.println ("aufgerufen");
    //Zeichne Kreis mit g
  }
}
 

Sir_Steve

Mitglied
ne, inetwa so:

Code:
class XYZ extends Canvas
{
    public XYZ ()
    {
        this.setSize();
        //usw
    }

    public void paint(Graphics g)
    {
        System.out.println("Paint aufgerufen!");
        // kreis malen (ned mit drawoval sondern jeden punkt einzeln, ist aber wurst)
    }
}

und in einer anderen Klasse habe ich dann son XYZ als member und rufe dann mit

Code:
member.repaint();

die paint wieder auf. Aber ich bekomme kein einziges "Paint aufgerufen!"
obwohl ja beim initialisieren des canvas schon einmal paint aufgerufen werden sollte...

also, was ist falsche?

thx 4 help!
 

Sir_Steve

Mitglied
Okay... ich habe jetzt ein bissal in der API herumgestöbert und bin auf update gestoßen.
Aber ich kapiere update nicht ganz, wie funktioniert das.

Ich habe ein Canvas und will das updaten, also schreibe ich doch
Code:
MeinCanvas.update();
Dann bekommen ich aber "can not resolve symbol".
Ich schätze das hat mit Graphics g zu tun, aber das kann ich doch ned übergeben.
Also wie verwende ich diese Methode?
Wenn ich das weiß glaube ich kann ich mein Problem lösen.

thx 4 help, Grüße Steve!
 
B

Beni

Gast
repaint ist schon richtig.

Ist das Canvas sichtbar? Paint wird vielleicht nur aufgerufen, falls eine Component sichtbar ist.

Poste doch mal den Code dieses Progs, damit man das ausprobieren kann.

mfg Beni
 

Sir_Steve

Mitglied
Okay, hier der Code
Bitte nix zu den namen sagen... die sind ungut...
sollte aber versteh bar sein....

Code:
import java.awt.*;
import java.math.*;
import java.io.*; 
import java.lang.*;

//Diese Klasse ist quasi das Prog, sie hat die Main und startet das Programm
class Wendel
{
	public static void main(String[] args)
	{
		System.out.println("Programme wurde gestartet!");
		WendelTreppe Flo = new WendelTreppe();
	}	
}

//Das ist die grafische Oberfläche, in ihr ein Canvas in dem gemalt wird
class WendelTreppe extends Frame
{
	MainCanvas Flaeche;
	Maler Steve;

	public WendelTreppe()
	{
		System.out.println("Konstruktor des Frames aufgerufen!");
		this.setSize(640,480);
		this.setLocation(0,0);
		System.out.println("Canvas wird erzeugt!");
		this.Flaeche = new MainCanvas();
		this.setVisible(true);
		this.Steve = new Maler(this);
		System.out.println("Thread wird gestartet!");
		Steve.start();
	}	
}

//Das ist der Thread der alle 10 Millisekunden einen Punkt malt
class Maler extends Thread
{
	WendelTreppe MeineWendelTreppe;
	Punkt[] PDF = new Punkt[360];
	int time;
	
	public Maler (WendelTreppe DeineWendelTreppe)
	{
		System.out.println("Konstruktor des Threads aufgerufen!");
		this.MeineWendelTreppe = DeineWendelTreppe;	
		System.out.println("PDF anlegen!");
		for(int j = 0; j < 360; j++)
		{
			this.PDF[j] = new Punkt();	
					
		}
		this.time = 0;
	}
	
	public void run()
	{
		//7
		System.out.println("Run gestartet!");
		double x, y;
		double helpVar;
		while(true)
		{
			try
			{
				if(time == 360)
				{
					time = 0;
				}	
				System.out.println(time);
				helpVar = (this.time * Math.PI) / 180;
				x = Math.cos(helpVar);
				y = Math.sin(helpVar);
				System.out.println(x + " " + y);
				this.PDF[this.time].setX(x);
				this.PDF[this.time].setY(y);
				this.time ++;				
				for(int i = 0; i < 360; i ++)
				{
					this.MeineWendelTreppe.Flaeche.setPDF(this.PDF[i], i);
				}
				
				System.out.println("Zeichnen wird aufgerufen!");
				MeineWendelTreppe.Flaeche.zeichnen();
				
				sleep(1000);
			}
			catch(Exception e)
			{
				System.out.println(e);
			}	
		}
	}
}

class MainCanvas extends Canvas
{
	Punkt[] PDF = new Punkt[360];
	
	public MainCanvas()
	{
		System.out.println("Konstruktor des Canvas aufgerufen!");
		this.setSize(150,150);
		this.setLocation(0,0);
		this.setVisible(true);
	}	
	
	public void setPDF(Punkt point, int i)
	{
		this.PDF[i] = point;	
	}
	
	public void zeichnen()
	{
		System.out.println("Paint wird aufgerufen!");
		this.repaint();	
	}
	
	public void paint(Graphics g)
	{
		System.out.println("PAINT!");
		Color schwarz = new Color(0,0,0);
		g.setColor(schwarz);
		for(int i = 1; i <= 360; i++)
		{
			double x = (this.PDF[i].getX()) * 100;
			double y = (this.PDF[i].getY()) * 100;
			g.drawLine((int)x,(int)y, (int)x, (int)y); 	
		}
	}
}

die klasse Punkt hat einfach nur 3 werte (XYZ) und ein paar methoden die hier aber ned wichtig sind.
Grüße, Steve!
 

Illuvatar

Top Contributor
Hallo Steve,

du hast folgendes im Konstruktor von WendelTreppe vergessen:
Code:
this.add (Flaeche);
Dann wird die Flaeche gezeichnet.

Da die Punkte PDF allerdings erst nach und nach initialisiert werden, wird in Zeile (nach der Änderung) 127 eine NullPointerException geworden:
Code:
double x = (this.PDF[i].getX()) * 100;//PDF[i] ist nicht initialisiert.

d.h. du musst die noch nicht initialisierten Punkte abfangen:
Code:
     for(int i = 1; i <= 360; i++)
      {
         if (this.PDF[i] == null) break;
         double x = (this.PDF[i].getX()) * 100;
         double y = (this.PDF[i].getY()) * 100;
         g.drawLine((int)x,(int)y, (int)x, (int)y);
      }

Dann gibt es allerdings eine ArrayIndexOutOfBoundsException. Die for-Schleife muss so aussehen:
Code:
for(int i = 0; i < 360; i++)

Jetzt wird, wenn auch sehr langsam (360 Sekunden = 6 Minuten!) etwas gezeichnet.

Übrigens wird der Kreis um den Nullpunkt des Koordinatensystems, also die linke obere Ecke des Fensters herum gezeichnet. Ist das Absicht?
Hier nochmal der ganze Code (ich habe dafür eine neue Klasse Punkt geschrieben)

Code:
import java.awt.*;
import java.math.*;
import java.io.*;
import java.lang.*;

//Diese Klasse ist quasi das Prog, sie hat die Main und startet das Programm
class Wendel
{
   public static void main(String[] args)
   {
      System.out.println("Programme wurde gestartet!");
      WendelTreppe Flo = new WendelTreppe();
   }
}

//Das ist die grafische Oberfläche, in ihr ein Canvas in dem gemalt wird
class WendelTreppe extends Frame
{
   MainCanvas Flaeche;
   Maler Steve;

   public WendelTreppe()
   {
      System.out.println("Konstruktor des Frames aufgerufen!");
      this.setSize(640,480);
      this.setLocation(0,0);
      System.out.println("Canvas wird erzeugt!");
      this.Flaeche = new MainCanvas();
      this.add (Flaeche);
      this.setVisible(true);
      this.Steve = new Maler(this);
      System.out.println("Thread wird gestartet!");
      Steve.start();
   }
}

//Das ist der Thread der alle 10 Millisekunden einen Punkt malt
class Maler extends Thread
{
   WendelTreppe MeineWendelTreppe;
   Punkt[] PDF = new Punkt[360];
   int time;

   public Maler (WendelTreppe DeineWendelTreppe)
   {
      System.out.println("Konstruktor des Threads aufgerufen!");
      this.MeineWendelTreppe = DeineWendelTreppe;
      System.out.println("PDF anlegen!");
      for(int j = 0; j < 360; j++)
      {
         this.PDF[j] = new Punkt();

      }
      this.time = 0;
   }

   public void run()
   {
      //7
      System.out.println("Run gestartet!");
      double x, y;
      double helpVar;
      while(true)
      {
         try
         {
            if(time == 360)
            {
               time = 0;
            }
            System.out.println(time);
            helpVar = (this.time * Math.PI) / 180;
            x = Math.cos(helpVar);
            y = Math.sin(helpVar);
            System.out.println(x + " " + y);
            this.PDF[this.time].setX(x);
            this.PDF[this.time].setY(y);
            this.time ++;
            for(int i = 0; i < 360; i ++)
            {
               this.MeineWendelTreppe.Flaeche.setPDF(this.PDF[i], i);
            }

            System.out.println("Zeichnen wird aufgerufen!");
            MeineWendelTreppe.Flaeche.zeichnen();

            sleep(1000);
         }
         catch(Exception e)
         {
            System.out.println(e);
         }
      }
   }
}

class MainCanvas extends Canvas
{
   Punkt[] PDF = new Punkt[360];

   public MainCanvas()
   {
      System.out.println("Konstruktor des Canvas aufgerufen!");
      this.setSize(150,150);
      this.setLocation(0,0);
      this.setVisible(true);
   }

   public void setPDF(Punkt point, int i)
   {
      this.PDF[i] = point;
   }

   public void zeichnen()
   {
      System.out.println("Paint wird aufgerufen!");
      this.repaint();
   }

   public void paint(Graphics g)
   {
      System.out.println("PAINT!");
      Color schwarz = new Color(0,0,0);
      g.setColor(schwarz);
      for(int i = 0; i < 360; i++)
      {
         if (PDF[i] == null) break;
         double x = (this.PDF[i].getX()) * 100;
         double y = (this.PDF[i].getY()) * 100;
         g.drawLine((int)x,(int)y, (int)x, (int)y);
      }
   }
}
class Punkt
{
  double x, y, z;
  void setX (double x){this.x = x;}
  void setY (double y){this.y = y;}
  void setZ (double z){this.z = z;}
  double getX(){return x;}
  double getY(){return y;}
  double getZ(){return z;}
}
 

Sir_Steve

Mitglied
wow, erstmals: :toll: DANKE! :toll:

immer diese dummen fehler... mal vergesse ich actionlistener zu adden, jetzt adde ich das canvas ned...
naja okay.

nun, das mit links oben ist keine absicht aber kein problem, das krieg ich hin (ja wirklich) !
und das mit den 6 minuten ist auch falsch da anfangs 10 millisekunden vorgesehen waren sich das aber bei unzähligen test geändert hat...

sonst passt alles!

VIELEN VIELEN DANKE!!! :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen


Oben