Frage

(Java SE 6) Ich versuche, einen Pop-up-Dialog zu erstellen, in dem eine "Bitte warten" -Meldung angezeigt wird, während mein Programm zeitintensive Arbeit leistet. Dazu habe ich mich für die Verwendung eines modlosen JDIALOGs entschieden, damit das Programm weiter ausgeführt wird und funktioniert, während der JDIALOG sichtbar ist (wenn Sie ein modales verwenden, wird das Programm angehalten, bis das Dialog vom Benutzer geschlossen wird). .

Das Problem ist, dass der JDIALOG mit einem Titel, wenn Sie auf diese Weise einen modlosen Dialog verwenden, aber der Inhalt nicht erscheint (ich vermute, sie werden aus irgendeinem Grund nicht gemalt). Ich habe versucht, Repaint usw. anzurufen, aber nichts scheint zu funktionieren.

Laut einigen Leuten auf den Interwebs ist dies ein echter Fehler mit Swing, und die einzigen Antworten, die ich gefunden habe, sind, die Dinge nicht so zu tun und einige andere Mittel zu finden, um den Benutzer zum Warten zu benachrichtigen. Ich bin gespannt, ob hier jemand dieses Problem schon einmal hatte und einen Arbeitsplatz herausgefunden hat.

Vielen Dank!

War es hilfreich?

Lösung

Als Alternative überlegen Sie die Verwendung SwingWorker und untermauerte Fortschritte zeigen, wie in dieser vorgeschlagen Beispiel.

Andere Tipps

Es ist kein Fehler, Sie müssen Ihren Job mit schwerem Gewicht und Ihren Auftrag mit leichtem Schwung in Seavred -Faden neben dem Hauptfaden ausführen. Es ist notwendig, weil die logischen Einflüsse zwischen dem Dialog -GUI -Thread und dem ActionListenereVents -Verhältnis zum schweren Weigen -Job im Hintergrund sind. Wenn Sie nicht trennen, werden Sie Ihren Hauptfaden aufgrund einiger Benachrichtigungsereignisse die Schwungauszeichnung degieren. Ich hatte das gleiche Problem, ich versuchte, den Fortschritt eines FTP -Upload -Fortschritts zu überwachen, den ich aus einem JFRame begann, um ihn in einem JDIALOG zu zeigen.

Zuerst habe ich es versucht:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
            /*Run JDialog with the Upload - ProgressBar*/
            FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
        }
    }.start();

/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);

// ...
    }

//...

}

Aber auf diese Weise gaint ich einen Jdialog -Frameborder und eine Balck -Inhaltsscheibe, aber ...

Nächster Versuch:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
        /*Run JDialog with the Upload - ProgressBar*/
        FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
    }
}.start();


new Thread(){

    public void run() 
            /*Run the heavy weigth Job - the Upload*/
            ftpPersistence.uploadFile(localFile, remoteFile);
        }
    }.start();
    // ... 
    }
//...
}

Und schließlich hat es funktioniert, hoffe es wird helfen;)

Ich benutze dies und es funktioniert - der ursprüngliche Code (ohne die Fix, die ich für das Neulackierungen im Laufe der Ausführung gefunden habe) stammt von hier aus:http://inversionconsulting.blogspot.com/2008/03/java-jdialog-jprogressbar-example.html

Aber ich habe es konsolidiert (mit leichten Änderungen):

JProgressBar pb = new JProgressBar(0,100);

pb.setPreferredSize(new Dimension(275,30));
pb.setString("Running");
pb.setStringPainted(true);
pb.setValue(0);

JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();

center_panel.add(label);
center_panel.add(pb);

JDialog dialog = new JDialog((JFrame)null, "Working ...");

dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setVisible(true);
dialog.setLocationRelativeTo(null); // center on screen

In meinem Code später, wenn es meine Schleife durchläuft (1 bis 10 mit der Variablen 'TOT'), habe ich den Dialog neu streicheln und die Fortschrittsleiste im Laufe des Programms aktualisiert, sodass das Programm durch die Schleife ausgeführt wird (dies ist nicht auf dem angegeben. Oben des Seitenlinks) (Ich verwende nicht mehrere Threads, all dies befindet sich im Haupt -Thread):

//set progress bar
pb.setValue(tot*10);
//repaint it
dialog.getContentPane().paintAll(pb.getGraphics());

Es dauerte viel Zeit und Versuch und Irrtum, um diese Lösung zu finden. Hoffe es funktioniert für dich wie für mich.

Hast du es versucht bestätigen() (Es wird benötigt, nachdem ein Container Komponenten hinzugefügt wurden)? Erwägen Sie auch den Quellcode zu veröffentlichen, damit wir ihn überprüfen können. Viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top