Question

(Java SE 6) Je suis en train de créer une boîte de dialogue pop-up qui affiche un message « S'il vous plaît attendre » alors que mon programme travaille un peu de temps à forte intensité. Pour ce faire, je l'ai choisi d'utiliser un modeless JDialog, de sorte que le programme continue de fonctionner et fonctionne alors que le JDialog est visible (si vous utilisez un modal, le programme arrêtera jusqu'à ce que la boîte de dialogue est fermée par l'utilisateur) .

Le problème est que lorsque vous utilisez une boîte de dialogue modales de cette façon la JDialog avec semble titre, mais le contenu ne pas (je suppose qu'ils ne soient peints pas pour une raison quelconque). Je l'ai essayé d'appeler repeindre, etc, mais rien ne semble fonctionner.

, selon un groupe de personnes sur les interwebs c'est un véritable bug avec Swing, et la seule réponse que j'ai trouvé sont de ne pas faire les choses de cette façon et trouver d'autres moyens d'informer l'utilisateur d'attendre. Je suis curieux de savoir si quelqu'un ici a eu ce problème avant et a trouvé un travail autour.

Merci!

Était-ce utile?

La solution

Comme alternative, envisagez d'utiliser SwingWorker et montrant les progrès intermédiaires, comme l'a suggéré dans cet exemple .

Autres conseils

d'une manière pas un bug, vous devez exécuter votre travail de poids lourd et votre travail swing léger dans thread's sepred à côté du fil conducteur. D'une manière nécessaire en raison des afflictions logiques entre l'interface de dialogue Discussion et ESt relation de ActionListenerEvents à l'emploi de weigth de lourd dans le backround. Si vous ne pas séparé votre fil principal sera deterinate Swing tirer en raison de certains événements de notification. J'ai eu le même problème, je tryed pour surveiller la progression d'un téléchargement FTP progrès que j'ai commencé un JFrame pour le montrer dans un JDialog.

D'abord, j'essayé:

//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);

// ...
    }

//...

}

Mais cette façon, je gaint un JDialog frameborder ans un contenu Balck volet, mais ...

Ensuite, essayez:

//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();
    // ... 
    }
//...
}

et enfin il a travaillé, espérons qu'il contribuera;)

J'utilise cela et il fonctionne - le code d'origine (sans le correctif j'ai trouvé pour repeindre car il fonctionne) est d'ici: http://inversionconsulting.blogspot.com/2008/03 /java-jdialog-and-jprogressbar-example.html

mais je l'ai consolidé à (avec de légères modifications):

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

Dans mon code plus tard, quand il est en cours d'exécution à travers ma boucle (étant de 1 à 10 en utilisant la variable « tot ») Je repeindre la boîte de dialogue, la mise à jour de la barre de progression des pistes de programme dans la boucle, thusly (ce n'est pas donné sur le lien de la page ci-dessus) (Je n'utilise plusieurs threads, tout cela est dans le thread principal):

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

Il a fallu beaucoup de temps et de tâtonnements pour trouver cette solution. Espérons que cela fonctionne pour vous comme pour moi.

Avez-vous essayé validate () (il est nécessaire après l'ajout de composants à un conteneur)? Voir également l'affichage du code source, afin que nous puissions le vérifier. Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top