2D-Grafik paintComponent quetsch alles in Panel

Kenan89

Bekanntes Mitglied
Hallo Leute,

ich bin dabei ein TileEditor zu schreiben und in meiner Klasse DrawTable("Zeichenblatt") existiert die paintComponent Methode. In dieser soll später durch addDirtyRegion eion ausgewähltes Tile gezeichnet werden.
Momentan ist die Methode paintComponent leer, d.h. es steht kein Code darin.

Sobald das Programm aber startet, scheint es so, als wolle er den ganzen JFrame in mein DrawTable-Panel zeichnen. Kennt einer dieses Verhalten und den Weg, es zu umgehen?

Danke im voraus.

Ein Screenshot:
sefgux6x.png
 
Zuletzt bearbeitet:
Stell mal ein KSKB rein, aus dieser Beschreibung lässt nicht kaum etwas vermuten.
Hehe, das Projekt ist schon ziemlich groß.
Ich bin seit 5 Minuten am Erstellen eines kleinen, überschaubaren Projekt, aber irgendwie funktioniert es da mit dem painten. Wenn ich ein überschaubares Projekt mit dem gleichen Fehler habe, poste ich. Wenn ihc denn Fehler dann nicht selber finde.^^
 
Jetzt wäre ein guter Zeitpunkt um selber nach der Fehlerursache zu suchen, in dem du dein funktionierendes KSKB mit dem eigentlich Programm vergleichst um die Unterschiede zu finden.
 
Theoretisch ja...
Aber es geht alles mit meinem Kurzen Ausführbaren Programm wunderbar.

Jetzt habe ich super.paintComponent(g) aufgerufen in der paint Component Methode und jetzt funktioniert es alles wunderbar... Das heisst, die DrawTable JPanel ist leer.

Ich weiss leider nicht wieso das so ist, und ob ich mein Fehler verbessert, oder nur unter den Tisch gekehrt habe...
 
Okay, das hat mein Problem nicht gelöst, denn jetzt kann ich gar nicht mehr auf dem Panel zeichnen. Keiner schon mal mit diesem Problem konfrontiert worden? Bis jemand antwortet suche ich mal weiter den Fehler 😀
 
rufst du das super.paintComponent(Graphics g) auch als erstes auf und dann machst du deine anderen sachen?
 
Momentan ist die Methode paintComponent leer, d.h. es steht kein Code darin.
Daran liegt's. Schreib zumindest
super.paintComponent(g);
an den Anfang (das kann da auch später noch stehenbleiben)
 
Ja, habe ich...
Irgendetwas bringe ich durcheinander...
Ich habe jetzt eine light-Version davon programmiert, wo alles wunderbar passt...
Ist echt komisch dass die JTextField-Inhalte von anderen JPanels, wo sich gar keine paintComponent Methoden in deren Klassen befinden, in die Klasse DrawTable gezeichnet werden. Eigentlich sollte in DrawTable nur das gezeichnet werden, was auch im JPanel DrawTable sich abspielt. WIe kommen denn da fremde JTextFields rein?
Hier die jar Datei falls es sich jemand ansehen will. Quellcode kann ich nachschicken, ist halt chon sehr viel mittlerweile.
Ladet euch einfach die runnable jar und das Tileset und steckt beide in denselben Ordner, denn ihr müsst das TileSet mit JFileChooser öffnen.

Vielleicht kann einer das Problem durch bloßes zuschauen erkennen.
 

Anhänge

  • loop.jar
    loop.jar
    309,9 KB · Aufrufe: 7
  • Tileset.png
    Tileset.png
    63,4 KB · Aufrufe: 39
Jetzt habe ich noch etwas interessantes gesehen. Öffnet man den JFileChooser um eine neue Datei anzulegen, und schließt ihr wieder, ohne eine Datei zu laden, dann wird auch das JFileChooser Fenster
in den DrawTable gezeichnet.

Das könnt ihr im obigen loop.jar ebenfalls sehen. Öffnet den JFileChooser und schließt ihn mal wieder.

Komisch...
 
Zum wie-oft-auch-immer'sten mal: Wenn du hier
Java:
	public void paintComponent(Graphics g){
	
		if(paint & tile!=null){
			g.drawImage(tile, startX, startY, this);
		}

	}
Die Zeile
Java:
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(paint & tile!=null){
			g.drawImage(tile, startX, startY, this);
		}

	}
einfügst, tritt das Problem dann immernoch auf?
 
Nein, denn dann wird alles gelöscht.
Wenn man ein Tile auswählt dann kann man über die DrawTable fahren und sieht eine Preview des ausgeählten Tiles auf der Maus Position. Klickt man, dann wird dieser Tile auf DrawTable gezeichnet.
Genau da kann ich super.... nicht gebrauchen, weil er dann auch das bereits gezeichnete löschen würde.
 
Ja, und das ist auch richtig so. Wenn dort irgendwas gezeichnet werden soll (egal ob eine "Preview" oder irgendwas anderes) muss es eben gezeichnet werden. Sich durch das Weglassen von super.paintComponent darauf zu verlassen, dass dort noch irgendwas von einem vorherigen Zeichendurchlauf zu sehen ist... ... ....

... ... sorgt für solche Threads wie diesen hier 😉
 
eine der Standard-Alternative erwähnt:
dauerhaftes Zeichnen auf einem Image-Objekt, in der paint-Methode super-Aufruf + Bild malen,
dann hat man immern noch den dauerhaften Zustand
 
Hä?
Ich verstehe deinen Post nicht ganz. Wie soll ich mit meinem TileEditor etwas zeichnen können, wenn nach jedem Mausklick auf DrawTable die ganze vorher gezeichnete Karte gelöscht wird?
Das kannst du ja nicht gemeint haben.
EDIT: Sagen wir, du zeichnest eine Grasfläche, nach jedem Klick ist das GrasTile vom vorherigen Zeichnen weg.

eine der Standard-Alternative erwähnt:
dauerhaftes Zeichnen auf einem Image-Objekt, in der paint-Methode super-Aufruf + Bild malen,
dann hat man immern noch den dauerhaften Zustand

Das könnte klappen, aber nicht etwas zu umständlich? Ich verstehe nur nicht, ob ich ein Fehler gemacht habe, oder ob es normal ist, dass irgenwie Spuren von anderen Panels in die DrawTable kommt.
 
Zuletzt bearbeitet:
> Ich verstehe nur nicht, ob ich ein Fehler gemacht habe, oder ob es normal ist, dass irgenwie Spuren von anderen Panels in die DrawTable kommt.

ich persönlich kann es leider nicht sagen, so komisch ist Swing häufig,
das super würde ich nicht weglassen, deswegen solche Fehler sind meiner Ansicht nach aber nicht ok,
und wenn ich mich gerade entscheiden müsste, dann glaube ich dass das alleine auch nicht die Ursache sein kann,
ist aber nahe 50/50..
 
Wenn Java sich entschließt irgendwas neuzuzeichnen, dann ist das eben so. Du kannst natürlich versuchen da drumherumzukommen und genau das Ergebnis bekommen welches du jetzt hast - es funktioniert nicht so richtig. Oder du nimmst hin und machst es so, wie man es machen sollte.
 
Bevor ich mein TileEditor angefangen habe, habe ich mir ein TileEditor Tutorial angeschaut und der funktionierte auch ohne super.paintComponent(g). Hier der Link dazu:
Karteneditor
 
ich persönlich kann es leider nicht sagen, so komisch ist Swing häufig,
das super würde ich nicht weglassen, deswegen solche Fehler sind meiner Ansicht nach aber nicht ok,

Als Swing-Fan muss ich da intervenieren 😀 Swing ist nicht "komisch". Es gibt glitches und beliebte Anfängerfehler (getGra****) aber die gibt es bei jedem GUI-Toolkit (was soll man sonst nehmen? SWT? :lol: ). In diesem Fall zeigt er dort wohl nur "irgendwas", was eben zufällig gerade in dem Speicherbereich der Grafikkarte lag, die jetzt diesem Fensterbereich entspricht (das könnte auch etwas Swing-fremdes sein). Und wenn man ihm sagt: "Wenn dieser Bereich des Fensters gezeichnet werden soll, dann mache NICHTS", dann macht er da eben NICHTS - auch nicht das löschen, was evtl. schon dort zu sehen ist...

@Kenan89: Ohne das im Detail nachvollzogen zu haben, sieht es aus, als würde er dort (in Abhängigkeit von getClipBounds, aber das ist hier dann zweitrangig) praktisch jedes mal den kompletten (relevanten) Zeichenbereich füllen. Dann sieht man natürlich nichts altes mehr...
 
Was ich nicht verstehe.
Das JPanel DrawTable wird ja vollgefüllt mit Grafiken, die eigentlich in anderen JComponenten sind. Beim ersten Laden einer Karte kann man das ja mit super.paintComponent(g) umgehen. Wenn ich aber dann auf ein Tile in der Box klicke und damit im Panel zeichnen will, dann werden mit dort in den Koordinaten 0,0 die x,y Bereiche der Maus angezeigt, die eigentlich im Panel "Details" zu sehen sind. Die beiden Panels(DrawTable und Details) haben nichts gemeinsam. Wie kann das passieren? Irgendwo passt der Code nciht.
 
Der Code ist (soweit man das behaupten kann) "richtig", abgesehen vom fehlenden super-Aufruf. Mehr weiß ich dazu jetzt nicht zu sagen :bahnhof:
 

Zurück
Oben