Erste Schritte Anzeige von Graphics Objekten einzeln aktualisieren

Berg

Mitglied
Liebe Java Gemeinde,

ich mache meine ersten Gehversuche in Java und kämpfe mich durch den Java Video Kurs...halb bin ich schon durch...
Das aktuelle Beispiel im Video ist mir zu komplex, ich wollte mir etwas einfacheres schreiben...und zum Teil funktioniert es super.
...aber ich bin eben Anfänger und bräuchte bitte euren Rat...

Mein Programm zeichnet Rechtecke mit Zufallsfarbe an Zufallsposition. Klappt super.
Das Fenster erscheint und alle Rechtecke erscheinen gleichzeitig.
Ich würde aber gerne sehen, wie jedes neue Rechteck einzeln dazu kommt (z.B. etwas ausgebremst mit Thread.sleep((long) ( Math.random() *500)); )

Ich vermute der Grund ist im Dunstkreis des EDT (Event Dispatch Thread) zu suchen und ich müsste "irgendwie" meinen Code, der die Rechtecke erstellt, in einen eigenen Thread packen,
dass der EDT das Zeichnen übernimmt und das Fenster nach jeder Erstellung eines Rechtecks aktualisiert wird. (Bitte verzeiht, wenn ich etwas ungenau formuliere)

Liege ich mit meiner Vermutung richtig?

Habt ihr `nen Tipp wie und wo ich da Hand anlegen muss?
...wäre super...

Vielen Dank & viele Grüße
Berg

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RechteckDemo extends JPanel
{
	@Override
	protected void paintComponent(Graphics g){	
		super.paintComponent(g);
		
		int pos_X1 = 0;
		int pos_Y1 = 0;
		int breite = 30;
		int hoehe = 30;
		int farbwertRot = 255;
		int farbwertGelb = 0;
		int farbwertBlau = 0;
		int transparenzWert = 255; 
		
		for (int i = 0; i <100; i++)
		{	
			pos_X1 = (int)(Math.random() * 400 + 1);
			pos_Y1 = (int)(Math.random() * 400 + 1);
			farbwertRot = (int)(Math.random() * 255 + 1);
			farbwertGelb = (int)(Math.random() * 255 + 1);
			farbwertBlau = (int)(Math.random() * 255 + 1);
			g.setColor(new Color(farbwertRot,farbwertGelb,farbwertBlau,
					transparenzWert));
			g.fillRect(pos_X1,pos_Y1,breite,hoehe);
		}
	}
	public static void main(String[] args){
		SwingUtilities.invokeLater(new Runnable() {  // (EDT)
			@Override
			public void run() {
				JFrame f = new JFrame();
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
				RechteckDemo g = new RechteckDemo();
				g.setPreferredSize(new Dimension(300,300));

				f.add(g);		
				f.pack();
				f.setLocation(850,250);
				f.setLocation(0,0);
				f.setVisible(true);
			}
		});
	}
}
 
Du müsstest die Zustände der Rechtecke irgendwo speichern. Ich denke ich würde mir eine Rechteckklasse schreiben mit den ganzen Werten die du brauchst (xpos, ypos, farbwert1 etc), nebst get Methoden. Dann deklarierst du dir ein Array von Rechtecken (in deinem Fall mit 100 Objekten). In einer fill Methode kannst du dann über das array iterieren und die Rechteck Objekte mit den Random Werten erzeugen.
Code:
RandomWerte....
recs[i] = new Rechteck(pos_X1, pos_Y1, farbwertRot, farbwertGelb, farbwertBlau, transparenzWert);
In einer zweiten draw Methode holst du dir das Graphics Object zB
Code:
Graphics g2 = this.getGraphics();
Dann iterierst du wieder über das array und holst dir deine Werte über die getMethoden aus den Rechtecken und zeichnest die:
Code:
g2.setColor(new Color(recs[i].getFarbWertRot(), recs[i].getFarbWertGelb(), recs[i].getFarbWertBlau(), recs[i].getTransparenzWert()));
g2.fillRect(recs[i].getPosx(), recs[i].getPosy(), breite, hoehe);
Dort kannst du dann auch dein Thread.sleep einbauen.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben