Warum nicht AWT und Swing mischen?
AWT und Swing machen beide etwas Ähnliches: sie zeichnen Buttons/Frames/... auf den Bildschirm. Da viele Swing-Komponenten von AWT-Komponenten erben, scheint es naheliegend, dass man die beiden mischen kann.
Inhaltsverzeichnis
Heavy- und lightweight
Doch dem ist nicht so!
Swing arbeitet mit sogenannten lightweight-Komponenten, AWT mit heavyweight. (Einzig JFrame
, JDialog
... sind ebenfalls heavyweight)
- Eine leichte Komponente kann transparente Pixel haben, eine schwere ist immer undurchsichtig
- Und darum können auch nur leichte Komponenten andere Formen als ein Rechteck haben
- MouseEvents können durch eine leichte Komponente hindurchfallen (auf die Parent-Component), bei schweren Komponenten werden sie immer abgefangen.
- Wenn sich eine leichte und eine schwere Komponente überlappen, ist immer die schwere zuoberst. Die vom Pogrammierer gesetzte Ordnung der Komponenten wird einfach ignoriert.
Der Vorteil von Swing
Die neuen, leichten Komponenten von Swing haben Vorteile:
- dass sie Ressourcen effizienter benutzen. Bei den leichten Komponenten wird einfach das
Graphics
-Objekt zum Zeichnen nach oben gereicht. Bei den schweren hingegen sitzt jede Komponente wie auf einem eigenen kleinenWindow
. - dass sie besser auf anderen Plattformen laufen (Mac, Linux, Windows, ...), weil sie komplett in Java geschrieben sind
- Und als kleines Zückerchen unterstützen die leichten Komponenten Pluggable LookAndFeel's.
AWT ist veraltet, und sollte wann immer möglich nicht mehr benutzt werden.
Wenn schon...
Sollte man AWT und Swing trotzdem mischen (z.B. weil eine Komponente nur in AWT existiert, Stichwort Java3D, JOGL), sollte man folgende Punkte beachten:
- Es sollte nie eine leichte Component eine schwere überdecken.
- Besonders erwähnen muss man, dass
JPopupMenu
(das auch fürJMenu
's benutzt wird). Diese Komponente kann sowohl als leichte, als auch als schwere Komponente benutzt werden. - Normalerweise ist das JPopupMenu auf "lightweight" gesetzt, aber mit
setDefaultLightWeightPopupEnabled( false )
kann man das umschalten (die Methode hat Einfluss auf alle JPopupMenus die noch kreiert werden, sollte also ziemlich früh aufgerufen werden). Dann überdecken Swing-Menüs AWT-Elemente. - Da PopupMenus auch bei der
JComboBox
verwendet werden, bewirkt diese Einstellung auch gleich, dass Comboboxen wieder funktionieren. - Dasselbe muss man für
JTooltip
s tun. Dort kann man die MethodeToolTipManager#setLightWeightPopupEnabled(boolean)
benutzen. - Da JFrame, JDialog,
JApplet
undJWindow
schwere Komponenten sind, lassen sie sich auch mit AWT mischen!
Fragen
Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!
- Besuche uns im Byte-Welt-Forum
- Besuche unseren Chat
Wir helfen dir gerne!
Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beni, 30. Mai 2004