[Java] Graphics g ruft sich selbst auf ?

NudelMC

Well-known member
ID: 46722
L
16 Juni 2006
178
5
Das ist mir bekannt allerdings hab ich ein kleines Problem damit
Ich versuche eine kleine Slotmaschine zu bauen, das ganze sieht so aus

PHP:
public void paint( Graphics g ) {
for(int i=0;i<=10;i++){
     g.drawImage(im[rnd1[i]],0,0,this);
     g.drawImage(im[rnd2[i]],450,0,this);
     g.drawImage(im[rnd3[i]],900,0,this);
         try{
         Thread.sleep(80);
         }catch(InterruptedException ie){  }
}
auswertung();
}
im ist ein Image array, und rnd1-3 sind zufallszahlen von zwischen 1und 10


Das funktioniert soweit auch ganz gut AUSER das die funktion auswertung(); 2mal aufgerufen wird, ich kann mir nicht erklären warum o_O

Hier mal noch der ganze Code
PHP:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

public class ImageTest extends Frame {

Image[] im = new Image[5];
int[] rnd1 =new int[11];
int[] rnd2 =new int[11];
int[] rnd3 =new int[11];

public ImageTest() {
//fenster
this.setSize(1350,450);

// Bilder Einfügen
im[0] = Toolkit.getDefaultToolkit().createImage( "baby1.jpg" );
im[1] = Toolkit.getDefaultToolkit().createImage( "baby2.jpg" );
im[2] = Toolkit.getDefaultToolkit().createImage( "baby3.jpg" );
im[3] = Toolkit.getDefaultToolkit().createImage( "baby4.jpg" );
im[4] = Toolkit.getDefaultToolkit().createImage( "baby5.jpg" );

// Slot starten
zahlen();
}

public void zahlen(){
Random generator = new Random();

// 10 mal 3 Zahlen erzeugen für die Animation und das Ergebniss
for(int i =0; i<= 10;i++){
rnd1[i] = generator.nextInt(5);
rnd2[i] = generator.nextInt(5);
rnd3[i] = generator.nextInt(5);
}
}

public void paint( Graphics g ) {
// 10 durchläufe für die Animation + Auswerung
for(int i=0;i<=10;i++){
     g.drawImage(im[rnd1[i]],0,0,this);
     g.drawImage(im[rnd2[i]],450,0,this);
     g.drawImage(im[rnd3[i]],900,0,this);
         try{
         Thread.sleep(80);
         }catch(InterruptedException ie){  }
}
auswertung();
}


// SOLL aufgerufen werden wenn die animation fertig ist
public void auswertung(){
System.out.println("Fertig");
}

public static void main( String[] args ) {
ImageTest fr = new ImageTest();
fr.setVisible( true );
}
}
 
die Paint Methode wird einmal durch setVisible ausgelöst und nochmal durch setSize und auch jedesmal wenn dein Fenster durch irgendein anderes überlagert wird.

Es ist sinnlos in die Paintmethode was anderes reinzupacken als Dinge die für das pure Zeichnen der Oberfläche da sind, da du fast keinen Einfluss darauf nehmen kannst wann sie nun ausgelöst wird.
 
bei überlagerungen, größen änderungen wird aber nur neu gezeichnet oder ?
Andere funktionen die nicht in der Graphics klasse stehen werden davon nicht beeinflusst ?
 
NudelMC schrieb:
bei überlagerungen, größen änderungen wird aber nur neu gezeichnet oder ?
Andere funktionen die nicht in der Graphics klasse stehen werden davon nicht beeinflusst ?
Du meinst, dass Methoden wie drawLine, fillRect, setFont, ... einfach so aufgerufen würden? Nein ... paint ist eine Callback-Methode (übrigens abstract deklariert in Component oder so, also viel weiter oben in der Hierarchie), die genau dann aufgerufen wird, wenn ein Neuzeichnen erforderlich ist.

Ähm und nochwas ... paint hat mit Graphics ja nun überhaupt nichts zu tun.

Oder warte, sagen wir bezogen auf meinen ersten Satz, es werden natürlich nur die Methoden von Graphics aufgerufen, die du in der Definition von paint benutzt. Die JVM würfelt nicht ;).
 
Zuletzt bearbeitet:
BFabian schrieb:
Du meinst, dass Methoden wie drawLine, fillRect, setFont, ... einfach so aufgerufen würden? Nein ... paint ist eine Callback-Methode (übrigens abstract deklariert in Component oder so, also viel weiter oben in der Hierarchie), die genau dann aufgerufen wird, wenn ein Neuzeichnen erforderlich ist.

Ähm und nochwas ... paint hat mit Graphics ja nun überhaupt nichts zu tun.

Oder warte, sagen wir bezogen auf meinen ersten Satz, es werden natürlich nur die Methoden von Graphics aufgerufen, die du in der Definition von paint benutzt. Die JVM würfelt nicht ;).


tjoa bahnhof sag ich mal dazu :p

Ich hab gar kein Plan von java :mrgreen:
Ich komm aus der PHP / asp.net Welt, da ist alles so viel einfacher :p

Gleich noch ne neue frage:

Kann ich mit Java und den Graphic funktionen ein halb transparentes schwarzes rechteck zeichen ?

Also schwarz und Rechteck schaff ich, aber halb transparent ?

Vielen Dank
Nudel
 
zu deinem ersten Problem:
Es sollte helfen die auswertung Methode aus paint rauszunehmen und sie einfach auf nen Button zu legen.
 
NudelMC schrieb:
Kann ich mit Java und den Graphic funktionen ein halb transparentes schwarzes rechteck zeichen ?
Das geht ... eine genaue Anleitung kann ich aber nicht liefern. Grob umrissen: ein BufferedImage erstellen, darin malen (mit Alphakomponenten usw.) und das anschließend mit der drawImage-Methode von Graphics in das Graphics-Objekt des Applets schreiben. Ausprobiert hab ich das noch nicht. Klingt aber mal nach einer halben Stunde interessanter Recherche, vllt. mach ichs ... ;)