Swing Painting - Unklarheiten (?)

Bizarrus

Bekanntes Mitglied
Huhu :)
Ich habe mich nun durch einige Tutorials durchgemogelt, aber verstehe nicht unbedingt, wie ich nun mein Problem lösen kann.

Ich arbeite mit Swing (sprich JApplet, JFrame, etc (??)).
Wenn ich nun Auf dem Applet mehrere Panels habe, die etwas zeichnen, werden einige Sachen nicht immer richtig angezeigt. Sprich hin und wieder werden einige Gezeichnete Sachen nicht dargestellt.

Bei den Panels nutze ich paintComponent - so wie ich es verstanden habe, sollte man die normale paint-Methode nicht überschreiben.

Warum aber werden nun einige Sachen nicht immer dargestellt?
Auch verstehe ich nicht ganz (weil es nicht explizit in irgendwelchen Tutorials angegeben wird), wie ich beispielswiese super.paintComponent anwende.

Hier mal einige Beispiele. Was hiervon ist Richtig btw ein Falscher Ansatz?
Java:
// Beispiel 1
public void paintComponent(Graphics g) {
	super.paintComponent(g);
	
	g.drawString("Hello World", 10, 10);
}

// Beispiel 2
public void paintComponent(Graphics g) {
	g.drawString("Hello World", 10, 10);
	
	super.paintComponent(g);
}

// Beispiel 3
public void paintComponent(Graphics g) {
	super.paintComponents(g);
	
	g.drawString("Hello World", 10, 10);
}

// Beispiel 4
public void paintComponent(Graphics g) {
	g.drawString("Hello World", 10, 10);
	
	super.paintComponents(g);
}
 
S

Spacerat

Gast
Ein Ansatz (also 2 Beispiele) dürfte schon mal komplett falsch sein: [c]super.paintComponents()[/c] aus [c]paintComponent()[/c] her aufzurufen, das könnte schlimmstenfalls zu einer Endlos-Rekursion führen.
Dann zeichnet man das unterste (hinterste) zuerst, sprich, erst [c]super.paintComponent()[/c] und dann [c]g.draw...[/c].
 

Bizarrus

Bekanntes Mitglied
Sprich, Beispiel 2 wäre hier der richtige Ansatz, oder?

Ich frage mich dann aber, warum bei mir immer noch nicht alles korrekt funktioniert.

So sieht derzeit die Befhldarstellung aus:
test1l4mmt.png


Und so sollte es eigendlich aussehen, wobei,wenn ich resize, wird es korrekt dargestellt:
test25fmsg.png


Edit:
Ok, ich glaube es liegt daran, dass bei der Initalisierung gleichzeitig gepainted wird und nebenbei noch eine Connection gestartet wird (?) Muss ich da mit Invokelater arbeiten?
Wobei die Connection in einem Extra Thread gestartet wird..
 
Zuletzt bearbeitet:
B

Bizzi

Gast
Zumal links die Texte neben den Eingabefeldern bereits JLabel sind.
Sobald ich aber die Serverseitige Applikation starte und mich mit dem Client verbinde, zeigt er nicht alles mehr an - Erst beim Resize.
 
S

SlaterB

Gast
Beispiel 1 ist richtig, besteht sonst aktuell eine Frage?

zu deiner Connection bisher wenig Code/ genaue Erklärungen
 

Bizarrus

Bekanntes Mitglied
Naja, das System wird eh opensource sein. Deswegen einmal hier der Client:
BananaModified.zip - Localhostr

Um den Zu testen, setze ich mal ebend den Chatserver Online auf.

Edit:
Server st am laufen.
Bitte beim Applet folgendes als Parameter angeben:

PORT = 9911
HOST = banana-modified.de
foreground = 444444
background = 800000
 
Zuletzt bearbeitet:

Bizarrus

Bekanntes Mitglied
Du liest anscheinend meine Beitraege nicht, oder?
Klar koennte ich auch eine List nehmen, dies ist aber nicht gewuenscht.

Das Thema buw. das Problem bezieht sich ausschliesslich auf das Painten, warum bei mir die Elemente nicht richtig dargestellt werden.

Du sagtest zuvor etwas von, icj solle JLabels nutzen. Wuerdest du dir die beigefuegte Source ansehen, wuesstest du, dass JLabels verwendet werden. Dennocj werden diese bei der initalisierung (sofern die connection aufgebaut wird) nicht dargestellt (erst, wenn das Applet resized wurde - ja ich verwende eine IDE (eclipse))
 
S

Spacerat

Gast
Wie bidde? Nach dem connecten und 'nem resize gehts? Wie etablierst du denn die Connection? Evtl. hilft ja ein repaint, wenn diese zustande gekommen ist. Ich hab's mir im veröffentlichtem Quelltext nicht angesehen, weil es sich für diese simple Hypothese die Suche danach einfach nicht lohnte. ;)
[EDIT]Evtl. wird auch der fehlerhafte Screen erst gar nicht angezeigt, wenn erst nach der Connection [c]setVisible(true)[/c] aufgerufen wird.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Bizarrus

Bekanntes Mitglied
Ich schau gleich nochmals drüber.

Nach dem connecten und 'nem resize gehts?
Ich arbeite mit Eclipse - Wenn ich dort das Applet starte wird es ja in einem Fenster angezeigt. Wenn ich dort Das Fenster resize, wird alles korrekt dargestellt.

Die Lesen der Connection selber läuft über einem Thread. Der In- und Outputstream sowie der Socket ist im Applet selber definiert.

Wenn ich den Serverseitigen kram aus habe und diesbezüglich eine Exception bekomme, dann wird es korrekt dargestellt. Wenn ich den Server aber an habe, streikt der bei der korrekten Darstellung.
 

noobadix

Bekanntes Mitglied
Hi,

ohne das Problem genau einkreisen zu können: Swing und Threads sollten afaik nicht miteinander zu tun haben, weil Swing eben nicht "threadsafe" ist. Stattdessen soll SwingWorker verwendet werden, hilft dir hier vielleicht auch?

Gruß!
 

bERt0r

Top Contributor
Für mich ein typischer Fall von "Ich programmiere so wie ich will und geb einen Dreck auf Konventionen". Das geht immer nur so lange gut, bis es mal hakt; und wenns dann hakt geht nichts mehr.
Meine 2 posts vorher waren provokativ, geb ich ja zu. Ich war mir aber auch nicht sicher ob du überhaupt weißt dass es JLabels und JLists gibt (was du offenbar tust). Du bist aber mit dem Look and Feel nicht zufrieden und machst dir darum eigene Klassen, bei denen du paintComponent überschreibst. Das ist auch ok, zumindest beim Button.
Wo du aber deine Strings zeichnest, die die Probleme bereiten, konnte ich nicht herausfinden.
Es gibt die Swing Komponenten damit man sie benutzt. Ist man mit dem Aussehen nicht zufrieden, kann man eine eigene UI installieren. Gerade ein JLabel bedient so ziemlich jeden Anspruch bzgl. Darstellung von Text. Zusätzlich kannst du diesen Text dann noch schön in einem Layoutmanager positionieren.
Wenn du deine ganze GUI im paintComponent aufbauen willst kannst du das machen, jemand anderer wird aber dann noch weniger durchblicken als du, wenn mal was nicht funktioniert.
 

Bizarrus

Bekanntes Mitglied
Für mich ein typischer Fall von "Ich programmiere so wie ich will und geb einen Dreck auf Konventionen".
Was hat dies bitteschön damit zu tun?
Gut, jeder hat seinen eigenen Programmier-Stil, oder nicht?
Da ich gewisse Dinge vorhabe, wo ich nicht unbedingt auf Standard-Komponenten zurückgreifen kann, wollte ich halt selbst painten.


Ich war mir aber auch nicht sicher ob du überhaupt weißt dass es JLabels und JLists gibt (was du offenbar tust).
Sollte ja jedem bekannt sein, der schonmal mit Java gearbeitet hatte.

Du bist aber mit dem Look and Feel nicht zufrieden und machst dir darum eigene Klassen, bei denen du paintComponent überschreibst. Das ist auch ok, zumindest beim Button.
Wo du aber deine Strings zeichnest, die die Probleme bereiten, konnte ich nicht herausfinden.
Es gibt die Swing Komponenten damit man sie benutzt. Ist man mit dem Aussehen nicht zufrieden, kann man eine eigene UI installieren.
Die Frage ist dann natürlich auch, ob dies dann Plöattformübergreifend funktioniert. Denn auf einem OSX-System geht dies meines Wissens nicht - Es wird immer die System-LaF genutzt (?). Korrigier mich bitte, sofern ich falsch liege.

Wenn du deine ganze GUI im paintComponent aufbauen willst kannst du das machen, jemand anderer wird aber dann noch weniger durchblicken als du, wenn mal was nicht funktioniert.
Der durchblick ergibt sich dadurch, wenn man überhaupt versteht was die jeweilige Klasse macht ;-)
Wenn ich nicht weiß, wofür die jeweilige Klasse zuständig ist, kann ich auch nicht nachvollziehen, was diese tut.

Meine Liste, die ich auf einem Panel zeichne macht nichts anderes als eine Liste darzustellen, wo es erlaubt ist den Text so zu Formatieren, soviele Icons/Grafiken einzubinden wie ich möchte und, und und.

Daraus ergibt sich, dass eine HashMap (mit den Listeneinträgen) durchgegangen wird und die jeweiligen Werte gepainted werden. Nicht nur das Painten übernimmt die Klasse, sondern auch das Handling der Events. Sprich, wenn beispielsweise ein "Hover" der Maus gegeben ist, oder wenn man auf einen Eintrag "klickt".

Und wenn man (wie ich schon gesagt habe), nicht weiß, was die Klasse überhaupt machen Soll, kann man auch die jeweilige Funktion/Methode nicht nachvollziehen.
 

Michael...

Top Contributor
Meine Liste, die ich auf einem Panel zeichne macht nichts anderes als eine Liste darzustellen, wo es erlaubt ist den Text so zu Formatieren, soviele Icons/Grafiken einzubinden wie ich möchte und, und und.
Das sollte auch mit einer JList und entsprechendem ListCellRenderer funktionieren.
Daraus ergibt sich, dass eine HashMap (mit den Listeneinträgen) durchgegangen wird und die jeweiligen Werte gepainted werden. Nicht nur das Painten übernimmt die Klasse, sondern auch das Handling der Events. Sprich, wenn beispielsweise ein "Hover" der Maus gegeben ist, oder wenn man auf einen Eintrag "klickt".
Ist damit "Hover" über den gesamten Listeneintrag/Zelle gemeint oder über bestimmte Elemente innerhalb des Eintrags / der Zelle. Ersters geht genauso mit JList.
 

Ähnliche Java Themen

Neue Themen


Oben