Re: Swing better than Awt?
Christian wrote:
Michael Rauscher schrieb:
Xiaochuan Fang wrote:
dolphin ??????:
Hi !Swing better than Awt?How do you think?
... while SWing is too slow.
No, not the old fairy-tale again.
Is it really a fairy tale?
Yes, it is.
Swing is based on AWT. The main difference between AWT and Swing is that
Swing paints components (and manage their states) by itself while AWT
let the native system paint them.
Consequences:
1. Swing is a tick slower than AWT.
2. Swing isn't thread-safe.
3. It's easier to produce Swing apps that aren't responsive.
ad 1) It's just a tick, so it's far away from being "too slow".
ad 2) As a result there's the single-thread rule:
Swing components can be accessed by only one thread at a time.
Note, that there are no guarantees that AWT is thread-safe.
It's a result of the underlying system.
ad 3) One can easily block the EDT - in both, Swing and AWT.
It's just that one can recognize a blocked EDT in a Swing
application immediately.
Let's compare what happens if one blocks the EDT in Swing
and AWT. To do this, we'll have a look at a GUI containing
one button that - if pressed - blocks the EDT for about
5 seconds.[1]
Swing: the button keeps pressed for 5 seconds.
In fact, the whole content of that window will not
get repainted within the 5 seconds.
AWT: the button returns to the normal state immediately.
So, how can one recognize a blocked EDT in a AWT app?
Resize the Window while the EDT is blocked. Both, the Swing
and the AWT app will not resize the button until
the 5 seconds are over.
In real apps one can't continue until the EDT is not blocked
anymore - in both, Swing and AWT.
Bye
Michael
[1] Sample application (negative), to call use
java SwingAWT [mode]
If mode is not given, the Swing version will run.
If mode is swing, the Swing version will run.
If mode is anything other, the AWT version will run.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingAWT {
private ActionListener listener = new ActionListener() {
public void actionPerformed( ActionEvent e ) {
try {
Thread.sleep(5000);
} catch ( InterruptedException ie ) {}
}
};
private Frame frame;
private Component button;
private void initAWT() {
button = new Button("Block EDT");
((Button)button).addActionListener( listener );
frame = new Frame("SwingAWT - AWT");
}
private void initSwing() {
button = new JButton("Block EDT");
((JButton)button).addActionListener( listener );
frame = new JFrame("SwingAWT - Swing");
}
public void createAndShowGUI( boolean awt ) {
if ( awt )
initAWT();
else
initSwing();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
frame.dispose();
}
});
frame.add( button );
frame.pack();
frame.setVisible(true);
}
public static final void main( String args[] ) {
final boolean awt =
(args.length < 1 || "swing".equals(args[0])) ?
false : true;
EventQueue.invokeLater( new Runnable() {
public void run() {
new SwingAWT().createAndShowGUI(awt);
}
});
}
}