/**
* Swing-GUI mit zwei Buttons
* Mit jedem kann eine Zaehlung gestartet werden.
* "Zaehlung EDT":
* Laeuft im EDT, GUI bleibt bis zum Ende der Zaehlung eingefroren
* "Zaehlung Worker"
* Mit Hilfe von SwingWorker laeuft die Zaehlung in eigenem Thread.
* Das GUI bleibt benutzbar.
* Es koennen auch mehrere Zaehlungen parallel laufen.
*/
// Erstellt von Booklover, 2007-08
// Getestet mit Sun-Java 6 unter Ubuntu 7.04
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.concurrent.*;
public class Swing4 extends JFrame {
private int zaehlungenWorker = 0;
// Komponenten der Benutzeroberflaeche
private JLabel label2 = new JLabel("Zaehlen bis:");
private JTextField textField = new JTextField("10");
private JButton btnCountEDT = new JButton("Zaehlung EDT");
private JButton btnCountWorker = new JButton("Zaehlung Worker");
private JLabel labelZaehl = new JLabel(
"Anz. Worker-Zaehlungen: " + zaehlungenWorker);
// Objekte, die das Interface ActionListener implementieren.
// Argumente fuer addActionListener()
private ActionListener listenerCountEDT = new ActionListener() {
public void actionPerformed(ActionEvent e) {
zaehlen();
}
};
private ActionListener listenerCountWorker = new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Worker().execute();
}
};
void zaehlen() {
System.out.println();
System.out.println("Beginn Zaehlung");
System.out.println("EDT? " + EventQueue.isDispatchThread());
String s = textField.getText();
int limit = 0;
try {
limit = Integer.parseInt(s);
for (int ii = 1; ii <= limit; ii++) {
System.out.println(ii);
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch (NumberFormatException ex) {
System.out.println(s + "... ungueltiges Zahlenformat");
}
}
// Konstruktor
public Swing4() {
btnCountEDT.addActionListener(listenerCountEDT);
btnCountWorker.addActionListener(listenerCountWorker);
// Offen:
// Warum sind die beiden Buttons nicht gleich breit?
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
int distTop = 5;
int posRow = 0;
gbc.gridx = 0;
gbc.gridy = posRow;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(distTop, 5, 5, 5);
add(label2, gbc);
//
gbc.gridx = 1;
gbc.gridy = posRow;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(distTop, 5, 5, 5);
add(textField, gbc);
//
// BUTTON EDT
gbc.gridx = 2;
gbc.gridy = posRow;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(distTop, 5, 5, 5);
add(btnCountEDT, gbc);
//
posRow++;
gbc.gridx = 0;
gbc.gridy = posRow;
gbc.anchor = GridBagConstraints.EAST;
gbc.gridwidth = 2;
gbc.insets = new Insets(5, 5, 5, 5);
add(labelZaehl, gbc);
//
// BUTTON WORKER
gbc.gridx = 2;
gbc.gridy = posRow;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 5, 5);
add(btnCountWorker, gbc);
setTitle(getClass().getSimpleName());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Swing4 o = new Swing4();
}
});
}
// Innere Klasse
// Als Typangaben void und Primitives nicht erlaubt
class Worker extends SwingWorker<Integer, Object> {
@Override protected Integer doInBackground() {
zaehlen();
return new Integer(0);
}
@Override protected void done() {
zaehlungenWorker++;
labelZaehl.setText("Anz. Worker-Zaehlungen: " + zaehlungenWorker);
}
}
}