Ich möchte eine Statusbar anzeigen während eine längere Aufgabe ausgeführt wird. Das funktioniert auch schon einigermaßen, siehe unten.
Wenn ich jedoch diese Zeile auskommentiere (ganz unten) funktioniert die Statusbar auf dem Hauptfenster nicht mehr. Das Dialogfenster sperrt das Hauptfenster solange der Thread arbeitet. Ich brauche also eine ähnliche Funktionalität, jedoch ohne Dialogfenster.
Java:
vDialog.setVisible(true);
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class DialogTest {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JProgressBar bar = new JProgressBar();
bar.setIndeterminate(false);
frame.getContentPane().add(bar, BorderLayout.SOUTH);
frame.getContentPane().add(new JButton(new AbstractAction("Test") {
public void actionPerformed(ActionEvent e) {
System.out.println(new SampleWorker(frame).doconnect(bar));
}
}), BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
}
private static class SampleWorker {
JDialog vDialog;
private boolean result;
public SampleWorker(JFrame frame) {
vDialog = new JDialog(frame, "5 Sekunden warten", true);
JProgressBar bar = new JProgressBar();
bar.setIndeterminate(true);
vDialog.getContentPane().add(bar);
vDialog
.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
vDialog.pack();
}
private void finish() {
vDialog.setVisible(false);
}
public boolean doconnect(JProgressBar bar) {
bar.setIndeterminate(true);
Thread workerThread = new Thread(new Runnable() {
public void run() {
// hier die Lange Funktion mit Rückgabewert boolean.
boolean done = true;
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = done;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
finish();
}
});
}
});
workerThread.start();
// hier: Dialog aufrufen
vDialog.setVisible(true);
bar.setIndeterminate(false);
return result;
}
}
}