Warum nicht AWT und Swing mischen?

Aus Byte-Welt Wiki
Version vom 4. November 2018, 16:16 Uhr von L-ectron-X (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

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.

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 kleinen Window.
  • 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ür JMenu'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 JTooltips tun. Dort kann man die Methode ToolTipManager#setLightWeightPopupEnabled(boolean) benutzen.
  • Da JFrame, JDialog, JApplet und JWindow 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!

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