Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160

    Problema con il thread in applicazione grafica

    Salve,

    nella mia applicazione grafica, vorrei che mentre l'utente preme un bottone che esegue un metodo, appaia una jdialo con la semplice scritta "Attendere prego".

    Per implementare questa cosa qui, ho trovato ispirazione in questo precedente thread.

    Ho così implementato le seguenti classi:

    Quella della JDialog:

    codice:
    package rubrica;
    
    public class DialogToUser extends javax.swing.JDialog {
    
       public DialogToUser(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            initComponents();
        }
    
        public DialogToUser() {      
            initComponents();
        }
        
        private void initComponents() {
    
            jLabel1 = new javax.swing.JLabel();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            setTitle("InfoToUser");
    
            jLabel1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
            jLabel1.setText("Attendere prego...");
    
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(24, 24, 24)
                    .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 158, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(90, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(35, 35, 35)
                    .add(jLabel1)
                    .addContainerGap(35, Short.MAX_VALUE))
            );
    
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    DialogToUser dialog = new DialogToUser(new javax.swing.JFrame(), true);
                    dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                        public void windowClosing(java.awt.event.WindowEvent e) {
                            System.exit(0);
                        }
                    });
                    dialog.setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify                     
        private javax.swing.JLabel jLabel1;
        // End of variables declaration                   
    
    }
    La classe del Thread:

    codice:
    public class MyThread extends Thread{
    
        JDialog jd;
        RubricaUI r;
        ContactsListPanel p;
        UserProfile user = Persistence.getCurrentUserProfile();
        DialogToUser dialog;
    
       public MyThread (RubricaUI rubricaUI) {
          this.r = rubricaUI;
          dialog = new DialogToUser(rubricaUI,false);
          dialog.setVisible(true);
       }
    
       public void run(UserProfile userProfile, String usr, String pwd) {
          int secondi = 0;
          try {
             r.openRubrica(userProfile, usr, pwd);
              while (secondi < 5) { // chiude la finestra dopo 30 secondi
                secondi++;
                sleep(1000); // attende 1 secondo
             }
             dialog.dispose();
          } catch (Exception ie) {
            ie.printStackTrace();
          }
       }
    
    }
    Ed infine nella classe dove c'è il bottone, ho il seguente codice:

    codice:
    private void btn_accediActionPerformed(java.awt.event.ActionEvent evt) {                                           
               .....
                MyThread t = new MyThread(this);
                t.run(userProfile, usr, psw_f);
                t.start();
    }
    Quando quindi l'utente clicca sul bottone, la JDialog appare ma non visualizza la label e poi quando completa l'azione, la Jdialog si chiude.

    Perchè non viene visualizzata la label della JDialog?

    Avendo precedentemente provato a fare una cosa simile con la progressBar, ma senza successo (anche perchè alla fine avevo lo stesso problema che non mi visualizzava la progressBar, ma il JFrame che la conteneva sì), può dipendere da quacosa tipo dai tread?

    Sto impazzendo e so che faccio impazzire pure questo forum, ma come si dice, non si finisce mai di imparare!

    Le mie orecchie sono aperte ai vostri consigli!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema con il thread in applicazione grafica

    Originariamente inviato da Cool81
    Le mie orecchie sono aperte ai vostri consigli!
    Ok, allora ti dico subito che non va affatto bene! Ci sono diverse cose sbagliate.

    Innanzitutto MyThread è sbagliato. il run() non deve avere argomenti!! Facendo così hai fatto un overload ... non un override (e rimane il run() di Thread che in questo caso non fa nulla).

    Ammettiamo anche di sistemare la cosa. In quel run() sei nel contesto di un thread a parte ... non del EDT. E quale è la regola principale sul threading in Swing? Salvo pochi casi particolari ben documentati, l'accesso alla interfaccia utente va fatto solo nel contesto del EDT. Quindi quel dialog.dispose() non va bene in quel contesto.

    Ma non è tutto qui. Hai scritto:
    codice:
                MyThread t = new MyThread(this);
                t.run(userProfile, usr, psw_f);
                t.start();
    Il run() non lo devi mai invocare tu!! Se lo invochi tu ... non diventa un "thread" di esecuzione a sé stante!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.