Hey,
Untiges KSKB zeigt ein Frame, in dem ein modaler JDialog über einen Button angezeigt werden kann. Irgendwie ist überall nur die Rede davon, dass modale JDialogs User-Eingaben in anderen Fenster unterbinden. Ja ok, passt. Aber fast nirgendwo wird erwähnt, dass das Anzeigen eines solchen Dialogs dazu führt, dass es in der Ausführung im Code nicht mehr weitergeht, bis er wieder geschlossen ist.
JEtzt könnte man meinen, "nicht mehr weitergehen" heißt, dass der aufrufende Thread blockiert wird. Aber offensichtlich ist das nicht der FAll - denn in dieser Demo ist der aufrufende Thread der EDT. Und dass genau dieser Thread (siehe sysouts!) während der Anzeige des Dialogs noch andere Dinge tun kann zeigt, dass er nicht wirklich in der actionPerformed hängt.
Was ich mich jetzt Frage: Wie kann man sich die Implementierung davon eig. vorstellen? Ist das quasi so ein temporäres return-Statement nach dem showMessageDialog(), zu dem dann per
(ist ja eig gar nicht implementiert?) beim Schließen des Dialogs zurückgesprungen wird?
Ich hoffe ihr versteht was ich meine. Ich kann mir halt grad nicht vorstellen wie ein und der selbe Thread in einer Methode A pausieren kann, während der gleichzeitig eine Methode B ausführt. Ein einziger Thread kann doch immer nur streng sequentiell arbeiten und nicht gleichzeitig an verschiedenen Stellen sein??? Nach meinem Verständnis müsste das Repainten der PRogressBar hängen bleiben, solange bis der Dialog geschlossen wurde.
So ist es ja bsp der Fall wenn man jetzt in der actionPerfmored statt dem Anzeigen des Dialogs einfach ein sleep() einbaut. Solange der EDT nicht aus der Methode retruned, passiert logischerweise inder GUI nix mehr. Aber hier ist das was anderes... ???:L
Bin dankbar für Aufklärung!
lg
Untiges KSKB zeigt ein Frame, in dem ein modaler JDialog über einen Button angezeigt werden kann. Irgendwie ist überall nur die Rede davon, dass modale JDialogs User-Eingaben in anderen Fenster unterbinden. Ja ok, passt. Aber fast nirgendwo wird erwähnt, dass das Anzeigen eines solchen Dialogs dazu führt, dass es in der Ausführung im Code nicht mehr weitergeht, bis er wieder geschlossen ist.
JEtzt könnte man meinen, "nicht mehr weitergehen" heißt, dass der aufrufende Thread blockiert wird. Aber offensichtlich ist das nicht der FAll - denn in dieser Demo ist der aufrufende Thread der EDT. Und dass genau dieser Thread (siehe sysouts!) während der Anzeige des Dialogs noch andere Dinge tun kann zeigt, dass er nicht wirklich in der actionPerformed hängt.
Was ich mich jetzt Frage: Wie kann man sich die Implementierung davon eig. vorstellen? Ist das quasi so ein temporäres return-Statement nach dem showMessageDialog(), zu dem dann per
Code:
goto
Ich hoffe ihr versteht was ich meine. Ich kann mir halt grad nicht vorstellen wie ein und der selbe Thread in einer Methode A pausieren kann, während der gleichzeitig eine Methode B ausführt. Ein einziger Thread kann doch immer nur streng sequentiell arbeiten und nicht gleichzeitig an verschiedenen Stellen sein??? Nach meinem Verständnis müsste das Repainten der PRogressBar hängen bleiben, solange bis der Dialog geschlossen wurde.
So ist es ja bsp der Fall wenn man jetzt in der actionPerfmored statt dem Anzeigen des Dialogs einfach ein sleep() einbaut. Solange der EDT nicht aus der Methode retruned, passiert logischerweise inder GUI nix mehr. Aber hier ist das was anderes... ???:L
Bin dankbar für Aufklärung!
lg
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class KSKB extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new KSKB().setVisible(true);
}
});
}
KSKB() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btnShowDialog = new JButton("Show MODAL dialog");
btnShowDialog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(threadInfo() + "betritt actionPerformed...");
JOptionPane
.showMessageDialog(
null,
"Der Thread, der die Anzeige dieses Dialogs angestossen hat,\nhängt jetzt in seiner Methode, bis dieser Dialog geschlossen wurde...");
System.out
.println(threadInfo() + "verlässt actionPerformed...");
}
});
final JProgressBar bar = new JProgressBar(0, 10);
bar.setPreferredSize(new Dimension(200, 50));
new Thread() {
public void run() {
while (true) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println(threadInfo()
+ "verarbeitet ProgressBar Event...");
int v = bar.getValue();
if (v < 10) {
v++;
} else {
v = 0;
}
bar.setValue(v);
}
});
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
add(btnShowDialog, BorderLayout.SOUTH);
add(bar, BorderLayout.CENTER);
pack();
setLocation(100, 100);
}
static String threadInfo() {
return "[Thread " + Thread.currentThread().getName() + " ("
+ Thread.currentThread().getId() + ")] ";
}
}
Zuletzt bearbeitet: