2D-Grafik BufferedImage, Line2D, Swing und die Probleme

Hallo liebe Leute,

Ich bin erneut an meine Java-Grenzen gestoßen und möchte euch um Rat / Hilfe bitten.

Ich zeichne aus einem Array heraus mit Graphics2D beziehungsweise Line2D eine Linie auf ein BufferedImage.

Sieht im Endeffekt so aus:

Java:
public void Zeichnen()
	{
		Graphics g = image.createGraphics();
		Graphics2D g2 = (Graphics2D)g;
		g2.setColor(color);

		a=0;
		b=1;
		c=2;
		d=3;

		for(int i = 0; i<=this.laenge-2; i++)
		{
			g2.draw(new Line2D.Double(ArrayNummer2[a],ArrayNummer2[b],ArrayNummer2[c],ArrayNummer2[d]));
			g2.drawString("HelloWorld", 100,100);
			g2.draw(new Line2D.Double(100,100,200,200));

			a += +2;
			b += +2;
			c += +2;
			d += +2;

			//System.out.println(i);
		}

		System.out.println("Zeichnen beenden!");
	}

Mein Problem hierbei ist nun, dass das 1. g2.draw erst gezeichnet wird, wenn ich die Scrollbalken bewege oder das Fenster vergrößere, verkleiner, etc., ABER g2.drawString und das 2. g2.draw sofort gezeichnet wird.

Woran könnte das liegen?
Restlicher Code wird auf verlangen natürlich nachgeliefert. 😉

Vielen Dank!

Ruben Knoch
 
Ob ein
g2.dispose();
am Ende der Methode darauf Einfluß hat, kann ich nicht 100% sagen, aber es könnte sein - unabhängig davon sollte es auf jeden Fall eingefügt werden!

Ansonsten noch ein
componentWoDasBildDraufGezeichnetWird.repaint();
am Ende (nach dem g2.dispose())
 
Mein Problem hierbei ist nun, dass das 1. g2.draw erst gezeichnet wird, wenn ich die Scrollbalken bewege oder das Fenster vergrößere, verkleiner, etc., ABER g2.drawString und das 2. g2.draw sofort gezeichnet wird.
Kann ich ohne Demobeispiel/code kaum glauben ;-)

Allgmein:
Java:
Graphics g = image.createGraphics();
Graphics2D g2 = (Graphics2D)g;
Code:
createGraphics()
liefert bereits als Graphics2D deklariertes Objekt. Die Zuweisung kann also direkt erfolgen und man kann sich den Cast sparen.
Java:
for(int i = 0; i<=this.laenge-2; i++)
Ist laenge hier die Länge des Arrays?

Es wird empfohlen in diesem Fall nach dem Zeichnen per
Code:
g2.dispose()
die Resourcen wieder freigeben.
 
Kann ich ohne Demobeispiel/code kaum glauben ;-)

Ist aber wirklich so. 😉
Ich hänge die Dateien an, alle gezippt, da das Codebeispiel zu lang ist.

Allgmein:

Code:
createGraphics()
liefert bereits als Graphics2D deklariertes Objekt. Die Zuweisung kann also direkt erfolgen und man kann sich den Cast sparen.

Das war nur zu "Übungszwecken", da ich ein wenig wegen meinem Problem rumhantiert habe, normalerweise ist der Cast nicht drinne. 😉

Ist laenge hier die Länge des Arrays?

Es wird empfohlen in diesem Fall nach dem Zeichnen per
Code:
g2.dispose()
die Resourcen wieder freigeben.

laenge ist die Laufzeit der Schleife, die aus einem anderen Programm geholt wird.


Beim Programm bitte aus der JComboBox nur "Info-Point" und "Kiosk" nehmen.
Und ebenfalls nur diese mit dem JTextField verwenden.

Nebenbei hab ich das gemerkt:

Eingabe ins Textfeld: ALLES wird erst nach Bewegeung, Verschiebung, etc. gezeichnet.
Auswahl von der Box: String und 2. g2.draw werden sofort gezeichnet, aber 1. g2.draw erst nachdem etwas bewegt wurde.

Und mal so Allgemein:

Wofür ist dispose() genau? Ist das beim zeichnen zwingend notwendig?
 
Zuletzt bearbeitet:
Mit deinem Graphics2D-Objekt zeichnest du in dein Image.
Wenn das Zeichnen beended ist, dann schliesst du das Graphics2D-Objekt, da es nicht mehr benötigt wird.

Gruß Vanny
 
Du darfst die paintComponent() Methode nicht direkt aufrufen, das macht die JVM für dich. Wenn du willst dass neu gezeichnet wird, machst du component.repaint()
 

Neue Themen


Zurück
Oben