Swing Falscher Ansatz zu richtigem Ansatz

Hallo, liebe Community.

Wie man eventuell schon aus dem Titel herauslesen konnte, geht es um das Tutorial "Zeichnen in Swing Tutorial" und meinen Java-Code.

Ich habe mir das Tutorial durchgelesen und zwar mehrere Male.
Aber ich komme einfach nicht auf den grünen Zweig.
Egal, wie ich bis jetzt mein Programm umgeschrieben habe, es hat NIE funktioniert.
Und dementsprechend bin ich jetzt auch frustriert darüber.

Ich habe schon verstanden, dass getGraphics() falsch ist und verstehe auch warum.
Aber ich habe bis jetzt immer noch nicht verstanden, wie ich genau meinen Text umschreiben muss, damit der richtige Ansatz funktioniert.

Ich habe mittlerweile schon über Monate versucht, mein Programm irgendwie dazu zu kriegen, das Zeichnen zu erledigen, vergeblich.

Im Folgenden sind meine 3 Programme, wobei es hier nur um OPPJ.java und PaintingComponent.java geht, ShortestPathFirstAlgorithmus.java ist komplett egal.

Ich hänge alle Datei, die in den Programmen benötigt werden, an.
Sodass ihr das mal austesten könnt und/oder mir sagen könnt, was ich falsch mache.

Ich kann die Dateien hier nicht in Code Tags schreiben, da maximal 25000 Zeichen zugelassen, aber es knapp 40000 Zeichen sind.
Außerdem musste ich alle Dateien packen, da mein Hintergrundbild zu groß war.

Vielen Dank schon Mal!
Ihr müsst nicht meinen Code korrigieren, jedoch wäre es nett mir die Fehler zu nennen.

Ruben K.
 

GUI-Programmer

Top Contributor
Ich hab mir dein Programm jetzt nicht angeschaut. Aber ich hatte glaube ich die selben/ähnlichen Problem wie du mit den Tutorial. Meine Lösung war daher, die ich mit einen anderen Nutzer hier entdeckt hatte, ein Interface zu erstellen. Dieses hat eine Methode mit den Parameter Graphics/Grahics2D. Im Model befindet sich dann eine Liste "mit den den Interfaces"
Code:
ArrayList<Paintable>
. Das JPanel welches für das Zeichnen zuständig ist zeichnet dann einfach "jedes Paintable der Liste vom Model".

Das ganze kannst du dir in Minimal MVC Example aus meiner Signatur anschauen. Nur dass bei diesen Beispiel nicht ein eigenes Interface erstellt wird, was einem erlauben würde alles mögliche zu zeichnen, sondern das Interface Shape verwendet wird.
 

bERt0r

Top Contributor
Der TO hat es noch nichtmal hinbekommen die paintComponent Methode zu überschreiben. Du sagst zwar du hättest das Tutorial durchgelesen, hast du auch wirklich das ganze durchgelesen? Da gehts nämlich weiter unten noch weiter.
 

eRaaaa

Top Contributor
Im Folgenden sind meine 3 Programme, wobei es hier nur um OPPJ.java und PaintingComponent.java geht, ShortestPathFirstAlgorithmus.java ist komplett egal.

Also eine paintComponent Methode (überschrieben von JPanel o.ä.) habe ich auf die Schnelle nicht finden können. Und getGraphics auf einem BufferedImage aufrufen und dann damit zu zeichnen ist NICHT verkehrt, es geht um Komponente wo es vermieden werden soll. Du zeichnest jetzt also auf das Image, okay soweit, nur wo zeichnest du das Image jetzt hin? -> normal könntest du jetzt das Image eben in der paintComponent des JPanels mit g.drawImage zeichnen! Also ich würde auch vorschlagen dass du dir das Tutorial oder auch andere Beispiele noch einmal angucken solltest!
 
Der TO hat es noch nichtmal hinbekommen die paintComponent Methode zu überschreiben. Du sagst zwar du hättest das Tutorial durchgelesen, hast du auch wirklich das ganze durchgelesen? Da gehts nämlich weiter unten noch weiter.

Entschuldigt bitte, ich hab nicht meine Versuche, den richtigen Ansatz zu implementieren, hier angehängt, sondern meine bisherigen Datei ohne große Veränderungen.

Ich wollte von euch nur wissen, wo meine Fehler liegen bzw. was ich umschreiben muss, damit es funktioniert. Im Anschluss werde ich dann eine Datei hochladen, welche ihr dann wieder "untersucht".

Ich habe mir das Tutorial wirklich durchgelesen, aber es hat bisher nie geklappt, wenn ich mit repaint() gearbeitet habe.
 

GUI-Programmer

Top Contributor
Ich habe mir das Tutorial wirklich durchgelesen, aber es hat bisher nie geklappt, wenn ich mit repaint() gearbeitet habe.

Kann ich eigentlich gar nicht glauben. Lies dir doch mal meinen Beitrag hier sowie den aus den Tutorial mal durch, den ich heute verfasst habe. Bevor du wieder irgendwas hochlädst und wir sollen dann untersuchen solltest du schon was sinnvolles dazu beitragen und auch unsere Vorschläge auch umsetzten (oder zumindest versuchen umzusetzten).
 
So, ich habe jetzt die paintComponent()-Methode eingebaut und es läuft an sich auch alles.
Aber bis jetzt wird repaint() immer noch nicht aufgerufen.

Ich habe bei meinem KeyListener/KeyEvent und meinem ItemListener/ItemEvent jetzt den repaint()-Aufruf mit eingebaut:
Java:
//pc.Zeichnen();
pc.repaint();


Dann habe ich in PaintingComponent die paintComponent()-Methode eingebaut, natürlich entspechendem Graphics-Parameter.
Kein Fehler beim kompilieren, jedoch wird nicht geupdatet.
Wenn ich allerdings die Zeichnen()-Methode verwende, klappt an sich alles.
Java:
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.geom.Line2D;
import javax.swing.JComponent;

class PaintingComponent extends JComponent
{
	BufferedImage image;
  	public int ArrayNummer2 [] = new int[500];
	ImageIcon icon;
	private Color color;
	int laenge;
	Graphics2D g2;
	int a = 0;
	int b = 1;
	int c = 2;
	int d = 3;

	/*public void Zeichnen()
	{
		if(color!=null)
		{
			Graphics g = image.getGraphics();
			g2 = (Graphics2D)g;
			g2.setColor(color);

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

			for(int i = 0; i<=this.laenge-2; i++)
			{
				//System.out.println(ArrayNummer2[a]+" "+ArrayNummer2[b]+" "+ArrayNummer2[c]+" "+ArrayNummer2[d]);
				g2.draw(new Line2D.Double(ArrayNummer2[a],ArrayNummer2[b],ArrayNummer2[c],ArrayNummer2[d]));
				a += +2;
				b += +2;
				c += +2;
				d += +2;
				//System.out.println(i);
			}
		}
		System.out.println("Zeichnen beenden!");
	}*/

	@Override
	protected void paintComponent(Graphics g)
	{

		super.paintComponent(g);
		if(color!=null)
		{
			g2 = (Graphics2D) g;
			g2.setColor(color);

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

			for(int i = 0; i<=this.laenge-2; i++)
			{
				//System.out.println(ArrayNummer2[a]+" "+ArrayNummer2[b]+" "+ArrayNummer2[c]+" "+ArrayNummer2[d]);
				g2.draw(new Line2D.Double(ArrayNummer2[a],ArrayNummer2[b],ArrayNummer2[c],ArrayNummer2[d]));
				a += +2;
				b += +2;
				c += +2;
				d += +2;
				//System.out.println(i);
			}
		}
	}

	public void bildSetzen(BufferedImage bild)
	{
		this.image = bild;
	}

	public void laengeBestimmen(int laenge)
	{
		this.laenge=laenge;
	}

	public void setColor(Color color)
	{
		this.color = color;
	}
}

Ich habe mir jetzt eben nochmal das Tutorial angesehen, aber eigentlich ist doch alles genau wie dort, oder?
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Das sind doch wieder zwei unterschiedliche Sachen, wie ich oben bereits schon schrieb:
Code:
Graphics g = image.getGraphics();

in deiner Zeichnen Methode zeichnest du auf einem BufferedImage, das machst du jetzt eben nicht mehr,sondern du zeichnest jetzt eben direkt auf deiner Komponente! :bahnhof::autsch:
Warum das jetzt nicht angezeigt wird kann mehrere Ursachen haben
 
Das sind doch wieder zwei unterschiedliche Sachen, wie ich oben bereits schon schrieb:
Code:
Graphics g = image.getGraphics();

in deiner Zeichnen Methode zeichnest du auf einem BufferedImage, das machst du jetzt eben nicht mehr,sondern du zeichnest jetzt eben direkt auf deiner Komponente! :bahnhof::autsch:
Warum das jetzt nicht angezeigt wird kann mehrere Ursachen haben

Okay, verstanden.
Dann werde ich weiterhin auf dem BufferedImage schreiben.

Dann stellen sich bei mir aber 2 Fragen.

Wenn ich nun mir das Image mit image.getGraphics() hole, zeichne ich ja darauf.
Doch das wird mir dann immer erst angezeigt, wenn ich das Fenster vergrößere oder die Scrollbalken bewege.
Also passiert das schon Mal an sich richtig.
Doch wie wird jetzt sofort gezeichnet?
Ich schätze mal, dass ich in Zeichnen() etwas machen muss.
Sollte ich dann einfach eine Komponente mit setVisible auf false und dann true setzen?
Damit sofort neu gezeichnet wird?
 

Ähnliche Java Themen


Oben