Swing Resize löst probleme...?

Status
Nicht offen für weitere Antworten.

lumo

Top Contributor
hallo,

ich habe mir einen editor geschrieben, indem mehrere jlabels in einer matrix dargestellt werden.
wenn man auf ein label klickt, wird per mouselistener das icon geändert.
mein problem ist nur dass das icon falsch dargestellt wird. sobald ich dann die größe des fensters ändere ist das icon korrekt dargestellt.

ich habs schon per validate/revalidate auf das label (mouselistener) versucht, das problem löst sich damit aber nicht...

hat jemand ideen?
(welche funtionen werden beim resize eigentlich standardmässig aufgerufen?)

PS: sorry für den dämlichen titel, allerdings weiss ich nicht, wie ich das BESSER nennen sollte...?
 
validate() + evtl. repaint() auf das umgebende JPanel oder gleich aufs ganze JFrame,
das Layout des JPanels bestimmt die Größe des JLabels

> welche funtionen werden beim resize eigentlich standardmässig aufgerufen?

sicherlich sowas wie validate() + evtl. repaint() auf JFrame, zumindest in der Wirkung,
vermute ich
 
Hast du mal auf das jFrame validate/revalidate, also nicht auf jedes Jlabel sonder auf die Componente wo die JLabels geaddet sind validate/revalidate aufgerufen?

@SlaterB

ich glaube revalidate ruf invalidate auf und setzt die Größe der Componente neu, so wie den LayoutManager? also organisiert die Componenten neu.

validate ist der vorgänger von revaliate glaube ich. und repaint Zeichnet alle Componenten neu.

Wenn ich falsch liege bitte Posten? würde mich auch Intressieren!!
 
Zuletzt bearbeitet:
die größe des labels ist nicht das problem.
habe jetzt auf das parent des labels ein validate... und ein revalidate versucht... hilft nichts.
aufs frame komm ich nicht (kanns mir grad nicht erklären)

Java:
		frame = new JFrame();
		...
		Editor editor = new Editor(...);
		frame.add(editor);
wenn ich auf dem editor ein getparent mach, schreit der compiler
Java:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JPanel cannot be cast to javax.swing.JFrame
sollte eigentlich nicht der fall sein...

.oO( ev. sollte ich das ganze teil noch mal neu beginnen )
 
rufst du Repaint auf, nach validate/ revalidate?
err, hab jetzt auf den Editor ein repaint() nun klappts...

bitte um erkärung warum ich ein repaint aufrufen muss, wenn ich standardfunktionen wie setIcon von JLabel verwende... sollten die das nicht selbst machen???
 
Zuletzt bearbeitet:
Versuche es aber mal, weil bei resize wird auch repaint aufgerufen? also die methode repaintParentIfNeeded, schau mal in den java code, was bei setSize passiert? und rufe einfach alle diese Mothoden auf, und schau welche würglich gebraucht wird? ach so revalidate wird auch bei setSsize aufgerufen.

Also versuche das mal:
Java:
JFrame f = new JFrame();
// ....
f.invalidate();		
f.repaint();
// .....
 
wie oben geschrieben, mit repaint klappts...
leider ist der editor etwas kompliziert geraten (viele panels etc übereinander)
und vom frame aus wird nichts gemacht, damit ich den editor auch in ein applet einbinden kann (was das ziel ist - zumindest eine abgespeckte version aka viewer...)
 
Weil du setzt die Compnenten Positionen neu, aber sagst nicht das sie auf der neuen Position gezeichnet werden soll. Deswegen.

einfach merken, wenn du validate oder revalidate auf rufst auch repaint aufrufen!!
 
Zuletzt bearbeitet:
Weil du setzt die Compnenten Positionen neu, aber sagst nicht das sie auf der neuen Position gezeichnet werden soll. Deswegen einfach merken, wenn du validate oder revalidate auf rufst auch repaint aufrufen!!

hmm ich ändere die positinen? womit?
bei einem klick auf das JLabel wird lediglich das Icon neu gesetzt (anderes bild) ändere ich damit schon die position?

BTW: vielen dank für die turboschnellen antworten 😉
 
Ok ja stimmt, aber die größe des JLabels, oder hast du die Prefersize vom jLabel ganau auf die Größe des Bildes gesetzt. weil die größe ändert auch was im LayoutManager, so wie die Position.
 
Es kommt auf den layoutManager an, der GridBagLayout nutzt die Prefirsize zum beispiel? musst einfach mal ausprobiren, ich nutze immer Prefertsize, aber dan muss man halt auf dem jFrame pack aufrufen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben