Domanda

(Java SE 6) Sto cercando di creare una finestra di dialogo pop-up che visualizza un messaggio "per favore aspetta" mentre il mio programma fa un lavoro ad alta intensità di tempo. Per fare ciò, ho scelto di utilizzare un jdialog moderato, in modo che il programma continui a funzionare e funziona mentre il jdialog è visibile (se ne usi uno modale, il programma si fermerà fino a quando la finestra di dialogo non sarà chiusa dall'utente) .

Il problema è che quando usi una finestra di dialogo Modeless in questo modo appare il jdialog con un titolo, ma il contenuto non lo fa (immagino che non vengano dipinti per qualche motivo). Ho provato a chiamare ridipingere ecc. Ma nulla sembra funzionare.

Ora, secondo un gruppo di persone sulle interweb questo è un bug genuino con swing, e le uniche risposte che ho trovato sono di non fare le cose in questo modo e trovare altri mezzi per avvisare l'utente di aspettare. Sono curioso di sapere se qualcuno qui ha avuto questo problema prima e ha capito un lavoro.

Grazie!

È stato utile?

Soluzione

In alternativa, considera di usare SwingWorker e mostrando progressi provvisorie, come suggerito in questo esempio.

Altri suggerimenti

Non è un bug, devi eseguire il tuo lavoro pesante e il tuo lavoro di oscillazione leggera nel filo di Sepred accanto al thread principale. È necessario a causa delle infligzioni logiche tra il thread della GUI di dialogo e la relazione di ActionListenerends con il pesante lavoro di Weigth nel backround. Se non separa il tuo thread principale determinerà il pareggio a causa di alcuni eventi di notifica. Ho avuto lo stesso problema, ho provato a monitorare l'avanzamento di un progresso del caricamento FTP che ho iniziato da un JFrame per mostrarlo in un JDIALOG.

Per prima cosa ho provato:

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

// ...
    }

//...

}

Ma in questo modo ho un riquadro di contenuto Balck un riquadro di contenuto Balck Ma ...

Prossimo tentativo:

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

E infine ha funzionato, spero che ti aiuti;)

Sto usando questo e funziona: il codice originale (senza la correzione che ho trovato per ridipingere mentre funziona) è da qui:http://inversionconsult.blogspot.com/2008/03/java-jdialog-and-jprogressbar-example.html

Ma l'ho consolidato a (con lievi modifiche):

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

Nel mio codice più avanti, quando viene eseguito attraverso il mio loop (essendo da 1 a 10 usando la variabile 'tot') rivernicino la finestra di dialogo, aggiornando la barra di avanzamento mentre il programma funziona attraverso il loop, quindi (questo non è fornito sul Link della pagina sopra) (Non sto usando più thread, tutto questo è nel thread principale):

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

Ci sono voluti molto tempo, tentativi ed errori per trovare questa soluzione. Spero che funzioni per te come fa per me.

Hai provato convalidare() (È necessario dopo aver aggiunto componenti a un contenitore)? Considera anche la pubblicazione del codice sorgente, in modo da poterlo controllare. Buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top