Si blocca la GUI con JProgressBar

di il
10 risposte

Si blocca la GUI con JProgressBar



Questo è quello che mi appare, ma dovrebbe apparire una cosa del genere:



public class BARRA_PROGRESSO {

    JFrame frame = new JFrame();
    JProgressBar barra;
    HOME home;
    int massimo;

    public BARRA_PROGRESSO(int minimo, int m, HOME h) {
        massimo = m;
        home = h;

        /*   BigDecimal risultato = minimo .divide(dividi);
Integer.parseInt(new DecimalFormat("#")).format(risultato + "");*/
        barra = new JProgressBar(0, m);

        frame.add(barra);
        barra.setBackground(Color.WHITE);
        barra.setStringPainted(true);
        barra.setFont(new java.awt.Font("Tahoma", 1, 30)); // NOI18N
        barra.setBounds(0, 0, 500, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 200);
        frame.setLayout(null);
        frame.setVisible(true);
        //   barra.setForeground(new java.awt.Color(45, 60, 128));
        Thread thread = new Thread(new Runnable() {
            public void run() {
                sistema_percentuale_();
            }
        });

        thread.start();

    }

    public void sistema_percentuale_() {

        while (true) {
            try {
                Thread.sleep(10);
                BigDecimal boh = home.conta_barra.divide(home.dividi_progress_bar);

                System.out.println(
                        boh.multiply(new BigDecimal("100")).divide(new BigDecimal(massimo + ""), RoundingMode.HALF_DOWN) + "%");

                barra.setValue(Integer.parseInt(new DecimalFormat("#").format(boh)));
            } catch (Exception e) {
                System.out.println("BARRA_PROGRESSO.sistema_percentuale_()" + e);
            }
        }

    }

}

Qualcuno mi sa aiutare?

10 Risposte

  • Re: Si blocca la GUI con JProgressBar

    Per prima cosa hai aggiunto la JProgressBar al frame.
    Poi hai tolto di mezzo dal frame il LayoutManager.

    Se proprio vuoi operare SENZA LayoutManager, la logica vorrebbe che:

    1) Togli il LayoutManager
    2) Imposti posizione e dimensione della JProgressBar
    3) Aggiungi la JProgressBar al contenitore

    In pratica, a te manca il passaggio 2: non hai impostato la posizione e la dimensione della JProgressBar, che di conseguenza mantiene i suoi valori predefiniti: posizione (0, 0) e dimensione (0, 0).

    Puoi usare setBounds() per settare posizione e dimensione in un colpo solo, oppure usare setLocation() e setSize().
  • Re: Si blocca la GUI con JProgressBar

    SpiritoLibero ha scritto:


    Per prima cosa hai aggiunto la JProgressBar al frame.
    Poi hai tolto di mezzo dal frame il LayoutManager.

    Se proprio vuoi operare SENZA LayoutManager, la logica vorrebbe che:

    1) Togli il LayoutManager
    2) Imposti posizione e dimensione della JProgressBar
    3) Aggiungi la JProgressBar al contenitore

    In pratica, a te manca il passaggio 2: non hai impostato la posizione e la dimensione della JProgressBar, che di conseguenza mantiene i suoi valori predefiniti: posizione (0, 0) e dimensione (0, 0).

    Puoi usare setBounds() per settare posizione e dimensione in un colpo solo, oppure usare setLocation() e setSize().
    Ti riferisci a frame.setLayout(null);? ho provato ad eliminarlo,non cambia nulla e poi setbounds e set size c'erano già
  • Re: Si blocca la GUI con JProgressBar

    Vero, non lo avevo visto sparpagliato in mezzo al resto.
    Effettivamente, copiando pari pari il tuo codice, a me compare la barra di progresso (poi non ho tutte le tue classi, quindi ho dovuto fargli saltare la parte di esecuzione del thread e togliere l'oggetto HOME dai parametri del costruttore).

    Se rimuovi frame.setLayout(null) allora i setBounds non servono a nulla perchè ci penserà il LayoutManager di default a gestire dimensione e posizione della JProgressBar: c'è un BorderLayout di default e non avendo specificato il constraint la barra verrà aggiunta al centro, occupando di conseguenza tutta la finestra.

    Per quanto riguarda la parte del thread, non si può dire molto, non avendo cognizione di cosa sia la classe HOME, che viene utilizzata al suo interno... di certo un while(true) non lo metterei mai: meglio avere una guardia che si possa controllare (per poterlo fermare), altrimenti quel thread girerà all'infinito, qualsiasi cosa accada al suo interno (il try/catch è DENTRO al while, quindi anche un eventuale errore non fermerà mai quel thread).
  • Re: Si blocca la GUI con JProgressBar

    SpiritoLibero ha scritto:


    di certo un while(true) non lo metterei mai: meglio avere una guardia che si possa controllare (per poterlo fermare), altrimenti quel thread girerà all'infinito, qualsiasi cosa accada al suo interno (il try/catch è DENTRO al while, quindi anche un eventuale errore non fermerà mai quel thread).
    Nella classe dove chiamo la JProgress bar C'è questo codice
     classe_barra.thread.stop();
            classe_barra.frame.dispose();
  • Re: Si blocca la GUI con JProgressBar

    Sto provando un altro metodo.
    Sono nella classe principale. Sopra il main ho scritto questo
       Thread thread_della_barra;
       

    e dentro una funzione che chiamo ho scritto questo codice
     thread_della_barra = new Thread(new Runnable() {
                public void run() {
    
                    JFrame frame = new JFrame();;
                    frame.setVisible(true);
                    frame.setSize(500, 200);
    
                    frame.setLayout(new AbsoluteLayout());
                    // frame.setResizable(false);  
                    frame.setIconImage(new ImageIcon("logo.png").getImage());
                    JProgressBar barra = new JProgressBar(0, 2000);
    
                    frame.getContentPane().add(barra, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 30, 380, 56));
    
                    try {
                        //       thread_della_barra.sleep(10);
                    
                        barra.setValue(1000);
                      
                    } catch (Exception e) {
                        System.out.println(".run()"+e);
                    }
    
                }
            });
            
            
            
            thread_della_barra.start();

    questo è quello che mi appare quando avvio il programma

    ma dovrebbe apparirmi questo

    Come risolvo il problema? Grazie.
  • Re: Si blocca la GUI con JProgressBar

    p0ll0_ ha scritto:


    Nella classe dove chiamo la JProgress bar C'è questo codice
     classe_barra.thread.stop();
            classe_barra.frame.dispose();


    Il metodo stop() della classe Thread è deprecato da almeno 20 anni... è stato addirittura rimosso da Java 11.
  • Re: Si blocca la GUI con JProgressBar

    Nel thread "thread_della_barra" crei una nuova finestra ( new JFrame() ) e all'interno dello stesso thread fai una Thread.sleep(). Tutto quel codice dovrebbe essere eseguito nel contesto del EDT (Event Dispatch Thread). Il EDT è il thread che si occupa di tutta la parte grafica e di gestione degli eventi di Swing che tu stai tenendo fermo con una sleep().
    Quello che succede è che prima viene eseguita una pausa di 20 millisecondi in cui nessun evento viene dispacciato, nessuna update grafica verrà fatta. Poi viene impostato il valore 1000, quindi l'EDT potrà aggiornare tutto: quindi solo dopo verrà effettivamente creata la finestra, visualizzata e tutto il resto.
  • Re: Si blocca la GUI con JProgressBar

    Ho provato a togliere sleep il problema rimane.
    Forse ho capito che c'è che non va. È il resto del codice. Se provo il codice che ho messo in un programma separato funziona alla perfezione, ma se metto dell'altro codice nel frattempo che il Thread è un corso si blocca. Vi faccio vedere un esempio di codice.

    public class cancellami extends javax.swing.JFrame {
    
        public cancellami() {
            initComponents();
    
            barra_progrezzo_();
            
            
            while(true){
                try {
                     Thread.sleep(10);
                     
                     
                     jLabel1.setText(""+new Random().nextInt(1000));
                     
                } catch (Exception e) {
                }
               
            }
            
            
            
    
        }
        Thread thread_della_barra;
    
        public void barra_progrezzo_() {
            thread_della_barra = new Thread(new Runnable() {
                int conta_barra = 0;
    
                public void run() {
    
                    JFrame frame = new JFrame();
                    frame.setVisible(true);
                    frame.setSize(500, 200);
    
                    frame.setLayout(new AbsoluteLayout());
                    // frame.setResizable(false);  
                    frame.setIconImage(new ImageIcon("logo.png").getImage());
                    JProgressBar barra = new JProgressBar(0,
                            Integer.parseInt(new DecimalFormat("#").format(1000)));
    
                    frame.getContentPane().add(barra, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 30, 380, 56));
    
                    barra.setBackground(Color.WHITE);
                    barra.setStringPainted(true);
                    barra.setFont(new java.awt.Font("Tahoma", 1, 30)); // NOI18N
                    while (true) {
                        try {
                            thread_della_barra.sleep(10);
    
                            System.out.println(conta_barra);
                            barra.setValue(conta_barra++);
    
                        } catch (Exception e) {
                            System.out.println(".run()" + e);
                        }
                    }
                }
            });
            thread_della_barra.start();
        }


    Se faccio partire il codice qui sopra vedo di nuovo la progressbar nera, mentre se faccio partite questo codice che è lo stesso di sopra ma senza il while con dentro new Random() funziona alla perfezione...
    public class cancellami extends javax.swing.JFrame {
    
        public cancellami() {
            initComponents();
    
            barra_progrezzo_();
            
            
          /*  while(true){
                try {
                     Thread.sleep(10);
                     
                     
                     jLabel1.setText(""+new Random().nextInt(1000));
                     
                } catch (Exception e) {
                }
               
            }*/
            
            
            
    
        }
        Thread thread_della_barra;
    
        public void barra_progrezzo_() {
            thread_della_barra = new Thread(new Runnable() {
                int conta_barra = 0;
    
                public void run() {
    
                    JFrame frame = new JFrame();
                    frame.setVisible(true);
                    frame.setSize(500, 200);
    
                    frame.setLayout(new AbsoluteLayout());
                    // frame.setResizable(false);  
                    frame.setIconImage(new ImageIcon("logo.png").getImage());
                    JProgressBar barra = new JProgressBar(0,
                            Integer.parseInt(new DecimalFormat("#").format(1000)));
    
                    frame.getContentPane().add(barra, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 30, 380, 56));
    
                    barra.setBackground(Color.WHITE);
                    barra.setStringPainted(true);
                    barra.setFont(new java.awt.Font("Tahoma", 1, 30)); // NOI18N
                    while (true) {
                        try {
                            thread_della_barra.sleep(10);
    
                            System.out.println(conta_barra);
                            barra.setValue(conta_barra++);
    
                        } catch (Exception e) {
                            System.out.println(".run()" + e);
                        }
                    }
                }
            });
            thread_della_barra.start();
        }
    


    E per la cosa che mi è sstata scritta sopra. Allora al posto di stop che cosa devo mettere?
    Adesso sto provando a mettere tutto il resto del codice in un altro thread separato, vediamo se funziona, ma che macello però
  • Re: Si blocca la GUI con JProgressBar

    Ho provato a fare tutto il resto in un thread (nel programma oriignale, non in quello di prova) infatti è un macello... Non c'è un'altra soluzone?
  • Re: Si blocca la GUI con JProgressBar

    Ma quel ciclo non finisce mai? A che serve?
Devi accedere o registrarti per scrivere nel forum
10 risposte