Auf meine Frage hier zu erklären, ist ein MCVE wo KLICKEN Klicken ein JButton
auf JDialog
A öffnet JDialog
B:Lange Prozess unter Swing-GUI: unerwartete Verzögerung
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
public class DiagA extends JDialog {
private DiagB diag;
public DiagA() {
super();
setTitle("main diag");
setSize(200, 150);
setLocation(400,400);
JButton btn = new JButton("Show DiagB");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showDiag();
}
});
add(btn, BorderLayout.NORTH);
//make main frame visible
setVisible(true);
}
void showDiag() {
if(diag == null) {
diag = new DiagB();
//this prints out as expected
System.out.println("set visible done");
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {}
//only after the delay diag shows in full
}
}
public static void main(String[] args) {
new DiagA();
}
}
class DiagB extends JDialog {
public DiagB() {
super();
setTitle("2nd diag");
setSize(150, 100);
setLocation(600,420);
setLayout(new FlowLayout(FlowLayout.CENTER));
getContentPane().setBackground(Color.YELLOW);
setVisible(true);
}
}
Wie Sie im Code sehen kann ich eine 3 Sekunden hinzugefügt Verzögerung nach dem Erstellen DiagB
. Klick auf den Button DiagB
zeigt wie folgt aus:
Erst nach 3 Sekunden Verzögerung endet, DiagB
zeigt in voller Länge:
Meine Fragen sind:
a. Warum zeigt DiagB
nicht vollständig, nachdem es aufgebaut ist? (Es zeigt sich nur dann vollständig, wenn showDiag()
zurückkehrt).
b. Der Grund für meine Frage ist, dass DiagB
aktualisiert werden muss, durch lange Prozesse in DiagA
.
Was ist der richtige Weg zu aktualisieren? Ist für jedes Update ein erforderlich?
Wenn es für die Anzeige ist, anstatt Benutzer-Interaktion, sollte es keine 'JDialog' sein, die für, nun ja, mit der Benutzer-Dialog. Und in einem Event-Handler sollte es niemals einen Sleep (oder irgendeinen anderen langen Vorgang) geben. – RealSkeptic
@RealSkeptic Ich verstehe, was Sie über lange Operationen in einem Event-Handler sagen. ('JDialog' oder' JFrame' wird in diesem Fall keinen großen Unterschied machen. Ein 'JDialog' könnte zum Beispiel für die Modalität benötigt werden). – c0der
Modalität bedeutet Benutzerinteraktion wird sofort benötigt. Ansonsten wird es nicht korrekt verwendet. – RealSkeptic