Warum nicht AWT und Swing mischen?

Status
Nicht offen für weitere Antworten.
B

Beni

Gast
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 Komponenten 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 Platformen 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 das 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 Tooltips tun. Dort kann man die Methode ToolTipManager.setLightWeightPopupEnabled( false ) benutzen.
  • Da JFrame, JDialog, JApplet und JWindow schwere Komponenten sind, lassen sie sich auch mit AWT mischen!

Ein guter Artikel zu der Geschichte findet sich hier.

Sollte man sich fragen, ob das wirklich so wichtig ist, hier ein Bild was bei Nichtbeachtung von gewissen Vorsichtsmassnahmen geschehen kann :wink:

(Mit freundlicher Genehmigung von @rastaman
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben