Swing and AWT Mixing is bad, but still done, why?
Asked Answered
L

3

15

I have noticed that people recommend not intermixing Swing and AWT Components, however we see this alot:

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
 //AWT imports though only for listeners
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

So why do many including Java (because I got that off their tutorial here) still use AWT imports, though I see its mainly for Listeners.

How do you add native Swing Listeners/Libraries for stuff like Key, Button, JComboBox presses/slections etc?

Or would I use firePropertyChangeListeners()? (though that relates to Java Beans)

It has been confusing me now for some time, most of my app have Swing and AWT which is said to be bad?

Lavinalavine answered 20/8, 2012 at 15:1 Comment(5)
it's not about mixing the packages - it's about mixing the components, that is not add a Swing JSomething to a awt Canvas (or Frame or whatever) nor vice versa. Though that advice is a bit dated: since sometime in a late 6 update release the issues in mixing have been resolved (so now you can use a Canvas with 3D in a Swing component)Molt
@Molt thank you for that now I undertsnad a bit more what was meantLavinalavine
See also Java GUI listeners without AWT.Schoof
@Molt 4 times out of 5 when people mix Swing & AWT components it is not an esoteric situation that justifies it. E.G. "My app. draws an image in the Canvas in a JFrame".Schoof
@AndrewThompson yeah, but that wasn't the point here :-)Molt
H
10

Swing shares quite a few classes with AWT, and uses some of the same implementation - note that javax.swing.JComponent (the base Swing component class) actually inherits from java.awt.Component (the base AWT container class)

It's actually not that much of a problem to mix Swing and AWT if you are careful. The main pitfalls are:

  • You risk getting a very different look and feel if you mix AWT and Swing UI components
  • Swing components are "lightweight" (rendered by Java) while AWT components are "heavyweight" (implemented as components in the host platform) - this means you will have problems if you put AWT components inside Swing components (the other way round is fine)
Henotheism answered 20/8, 2012 at 15:15 Comment(4)
finally found the article which explains the status of mixing component (since jdk6u12), havent read it, though ;-) java.sun.com/developer/technicalArticles/GUI/mixing_components/…Molt
@Molt The article link appears broken. This seems like the right one; confirm pls? oracle.com/technetwork/articles/java/… For future Googlers, it's titled Mixing Heavyweight and Lightweight Components By Sharon Zakhour and Anthony Petrov and begins "There are two kinds of graphics components in the Java programming language..."Cowell
I disagree that Swing components are lightweight; if anything, they are heavyweight. AWT uses native OS's code, while Swing makes Java render it.Underpinning
@Underpinning lightweight, in this context, means that it does not consume GUI resources from the host OS - see e.g. #417447Henotheism
B
11

Swing is built on top of AWT, with a different philosophy for creating and drawing UI components. Mixing UI components from the two frameworks could lead to unexpected results and was/is thus discouraged (as kleopatra states, this has been fixed). However, Swing still uses the AWT event queue paradigm, including listeners - it does not replace them with listeners native to Swing because there's no reason to.

Using both Swing and AWT for your applications is common practice, what you were warned against is using both Swing and AWT UI components.

Brockman answered 20/8, 2012 at 15:10 Comment(0)
H
10

Swing shares quite a few classes with AWT, and uses some of the same implementation - note that javax.swing.JComponent (the base Swing component class) actually inherits from java.awt.Component (the base AWT container class)

It's actually not that much of a problem to mix Swing and AWT if you are careful. The main pitfalls are:

  • You risk getting a very different look and feel if you mix AWT and Swing UI components
  • Swing components are "lightweight" (rendered by Java) while AWT components are "heavyweight" (implemented as components in the host platform) - this means you will have problems if you put AWT components inside Swing components (the other way round is fine)
Henotheism answered 20/8, 2012 at 15:15 Comment(4)
finally found the article which explains the status of mixing component (since jdk6u12), havent read it, though ;-) java.sun.com/developer/technicalArticles/GUI/mixing_components/…Molt
@Molt The article link appears broken. This seems like the right one; confirm pls? oracle.com/technetwork/articles/java/… For future Googlers, it's titled Mixing Heavyweight and Lightweight Components By Sharon Zakhour and Anthony Petrov and begins "There are two kinds of graphics components in the Java programming language..."Cowell
I disagree that Swing components are lightweight; if anything, they are heavyweight. AWT uses native OS's code, while Swing makes Java render it.Underpinning
@Underpinning lightweight, in this context, means that it does not consume GUI resources from the host OS - see e.g. #417447Henotheism
M
1

Maybe someone will see this in the future and still find it useful. There's a list of AWT components and what their Swing replacements are.

Marshall answered 19/11, 2014 at 14:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.