Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-10-2008, 17:27   #1
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
[JAVA] Aggiornare immediatamente il JPanel

Ciao a tutti.

Nell'applicazione che sto ultimando avrei bisogno di far accendere una JLabel di Please Waiting mentre si sta eseguendo l'algoritmo e farla spegnere al termine del calcolo.

Ho implementato il tutto in questo modo:

Codice:
pleaseWaitLabel.setEnabled(true);
repaint();
revalidate();

//Istruzioni che richiamano vari metodi per eseguire l'algoritmo principale

pleaseWaitLabel.setEnabled(false);
repaint();
revalidate();
Il problema è che l'aggiornamento del pannello non avviene immediatamente. A quanto pare esegue prima l'algoritmo e dopo aggiorna il pannello, di conseguenza si accende e si spegne immediatamente.

Come potrei risolvere? Esiste in alternativa una finestra da far comparire (stile JOptionPane) e chiudere automaticamente alla fine dell'eleborazione?

Grazie anticipatamente.

Ciao,
Francesco
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2008, 17:55   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Guarda qua che fa revalidate().
Inoltre non dovrebbe essere neccessario chiamarlo.

Hai già provato così:
Codice:
pleaseWaitLabel.setEnabled(true);
repaint();

//Istruzioni che richiamano vari metodi per eseguire l'algoritmo principale

pleaseWaitLabel.setEnabled(false);
repaint();
P.S.: il codice che viene eseguito alla riga "//Istruzioni che richiamano vari metodi per eseguire l'algoritmo principale" viene eseguito dallo stesso Thread in cui ti trovi o hai lanciato un altro thread per occuparsene?
Puoi postare uno spezzone maggiore del codice?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 27-10-2008 alle 17:57.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2008, 18:21   #3
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
We, ciao banryu!

Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Guarda qua che fa revalidate().
Inoltre non dovrebbe essere neccessario chiamarlo.
L'ho richiamato, oltre al metodo repaint(), perchè per alcune funzioni funziona meglio l'uno o l'altro. Ad esempio quando aggiungo attività (non so se ricordi grossomodo l'applicazione) il metodo repaint() non mi aggiorna il pannello, mentre revalidate() si. Al contrario quando le rimuovo solo revalidate() mi lascia degli artefatti sul pannello, mentre repaint() lo pulisce completamente.


Quote:
Originariamente inviato da banryu79 Guarda i messaggi
P.S.: il codice che viene eseguito alla riga "//Istruzioni che richiamano vari metodi per eseguire l'algoritmo principale" viene eseguito dallo stesso Thread in cui ti trovi o hai lanciato un altro thread per occuparsene?
Puoi postare uno spezzone maggiore del codice?
Stesso Thread.

Ecco altro codice (posto l'intera azione del listener):
Codice:
if(e.getSource() == computeButton) {
                
                int numRepetitions = -1;
                int acyclic = 0;
                
                try {
        
                    if (getRepetitions() > 0)
                        numRepetitions = getRepetitions();
                    else
                    JOptionPane.showMessageDialog(null,
                        "<html><body>The format is not valid!<br>" +
                        "Please enter a positive integer<br>" +
                        "and less than 2147483648.</body></html>", "Error", 
                        JOptionPane.ERROR_MESSAGE);
                }
        
                catch(NumberFormatException exception) {
            
                    JOptionPane.showMessageDialog(null,
                        "<html><body>The format is not valid!<br>" +
                        "Please enter a positive integer<br>" +
                        "and less than 2147483648.</body></html>", "Error", 
                        JOptionPane.ERROR_MESSAGE);
            
                }
                
                pleaseWaitLabel.setEnabled(true);
                
                //Refresh MainPanel
                repaint();
                revalidate();
                
                if(numRepetitions > 0) {
                    
                    ArrayList<ArrayList<Object>> dataActArray = new ArrayList<ArrayList<Object>>();
                    dataActArray = getDataAct();
                    
                    if(dataActArray.get(0).size() > 1) {
                        
                        startSimulations = System.currentTimeMillis();
                        
                        MCSimulation mcs = new MCSimulation(numRepetitions, dataActArray);
                        acyclic = mcs.topologicalSort();
                        
                        if(acyclic == 1) {
                            System.out.println("Array (prima colonna) ordinato topologicamente:");
                            mcs.printSortArray();
                            mcs.makeInNodes();
                            System.out.println();
                            System.out.println("Matrice inNodes:");
                            mcs.printInNodes();
                            System.out.println();
                            System.out.println("Array inDegree:");
                            mcs.printInDegree();
                            System.out.println();
                            System.out.println();
                            mcs.simulations();
                            stopSimulations = System.currentTimeMillis();
                        } else {
                            stopSimulations = System.currentTimeMillis();
                            JOptionPane.showMessageDialog(null,
                                "<html><body>The following activities make a cyclical project!!!<br>" +
                                "Please check all precedences in the activities!!!</body></html>", "Error", 
                        JOptionPane.ERROR_MESSAGE);
                        }
                        
                        timeSpentField.setText(""+((double)(stopSimulations-startSimulations)/1000));
                    
                    } else {
                        System.out.println("Error: ci sono state delle eccezioni!");
                    }
                
                }
                
                pleaseWaitLabel.setEnabled(false);
                
                //Refresh MainPanel
                repaint();
                revalidate();
                
            }
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2008, 09:19   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Dato che lo spezzone di codice postato è quello contenuto in un Listener significa che il Thread in cui viene processato è l'EDT.

L'EDT (Event Dispatching Thread) è il Thread di AWT che processa eventi AWT, per l'appunto. AWT usa un modello di painting a thread singolo dove tutti gli aggiornamenti della grafica vengono processati in un singolo Thread.

L'EDT è l'unico thread valido da cui poter aggiornare lo stato visibile dell'interfaccia grafica utente. Questo implica, tra l'altro, che aggiornare la grafica da altri thread diversi dall'EDT può essere causa di comportamenti anomali e funzionamenti non corretti dell'interfaccia grafica.

C'è poi anche il rovescio della medaglia da considerare. E cioè far eseguire all'EDT anche troppo lavoro (per esempio l'esecuzione di un algoritmo o dell'altro codice "che porta via tempo") col rischio di appesantire la velocità di risposta dell'interfaccia grafica.

Venendo al punto: dato che subito prima di eseguire l'algoritmo vuoi abilitare una JLabel disbilitata, e che nel farlo poi chiami di fila a repaint() un revalidate(), e che leggendo la documentazione a proposito di revalidate() notiamo che dice:
Quote:
public void revalidate()

Supports deferred automatic layout.

Calls invalidate and then adds this component's validateRoot to a list of components that need to be validated. Validation will occur after all currently pending events have been dispatched
l'esecuzione successiva del codice del tuo algoritmo tiene impegnato il thread EDT.
Potrestri provare a inserire il codice relativo al tuo algoritmo nel metodo run() di un altro thread creato al volo.
Puoi fare una cosa del genere:
Codice:
Thread algoThread = new Thread() {
        public void run() 
        {
            // codice algoritmo
        }   
    };
    algoThread.start();
Questo dovrebbe "liberare" l'EDT dall'esecuzione dell'algoritmo e permettergli di visualizzare in tempo la JLabel (anche se, come avrai capito, l'aggiornamento non è *istantaneo*).


Ah, prima volevo farti una domanda: perchè la JLabel segli di abilitarla (setEnable), invece di renterla semplicemente visibile e invisibile (setVisible)?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2008, 12:20   #5
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
Capisco, sei stato molto chiaro.

Il problema che mi si presenta però è che avendo variabili dichiarate esternamente (come numRepetitions) mi suggerisce di dichiararle "final" (cosa che naturalmente non posso fare) affinchè il thread possa "usufruirne".

Come posso aggirare questo problema?

Altrimenti devo inglobare dentro il thread tutto il codice che viene eseguito cliccando sul pulsante Compute (e non solo l'algoritmo) TRANNE le istruzioni per la JLabel...

P.S. setVisible è infatti la soluzione finale. Per provare però ho volutamente utilizzato setEnabled, in modo da esser sicuro (vedendo sia la parte spenta che accesa) che tutto funzionasse a dovere... cosa che fin'ora non è accaduto!

Ultima modifica di pumax84 : 28-10-2008 alle 12:23.
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2008, 13:19   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da pumax84 Guarda i messaggi
P.S. setVisible è infatti la soluzione finale. Per provare però ho volutamente utilizzato setEnabled, in modo da esser sicuro (vedendo sia la parte spenta che accesa) che tutto funzionasse a dovere... cosa che fin'ora non è accaduto!
Ma scusa, prova direttamente con setVisible() no? Perchè complicarti la vita ?
Prova con setVisible() e senza la chiamata a revalidate().

@EDIT:
in ogni caso devi delegare ad un altro thread (esterno quindi all'EDT) l'esecuzione dell'algoritmo.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 28-10-2008 alle 15:32.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2008, 14:31   #7
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Ma scusa, prova direttamente con setVisible() no? Perchè complicarti la vita ?
Prova con setVisible() e senza la chiamata a revalidate().
Si, era più che altro per vedere all'inizio (quando stavo costruendo l'interfaccia) l'aspetto che avrebbe avuto quella JLabel lì. Avevo impostato all'inizio il setEnabled ed era rimasto così.

Quote:
Originariamente inviato da banryu79 Guarda i messaggi
@EDIT:
in ogni caso devi delegare ad un altro thread (esterno quindi all'EDT) l'esecuzione dell'algoritmo.
Ho inglobato tutto dentro il thread, tranne il setVisible(true) iniziale. Funziona alla grande. Grazie mille di nuovo!

Ecco il codice:
Codice:
            if(e.getSource() == computeButton) {
                
                Thread algorithmThread = new Thread() {
                    
                    @Override
                    public void run() 
                    {

                        int numRepetitions = -1;
                        int acyclic = 0;

                        try {

                            if (getRepetitions() > 0)
                                numRepetitions = getRepetitions();
                            else
                            JOptionPane.showMessageDialog(null,
                                "<html><body>The format is not valid!<br>" +
                                "Please enter a positive integer<br>" +
                                "and less than 2147483648.</body></html>", "Error", 
                                JOptionPane.ERROR_MESSAGE);
                        }

                        catch(NumberFormatException exception) {

                            JOptionPane.showMessageDialog(null,
                                "<html><body>The format is not valid!<br>" +
                                "Please enter a positive integer<br>" +
                                "and less than 2147483648.</body></html>", "Error", 
                                JOptionPane.ERROR_MESSAGE);

                        }

                        if(numRepetitions > 0) {

                            ArrayList<ArrayList<Object>> dataActArray = new ArrayList<ArrayList<Object>>();
                            dataActArray = getDataAct();

                            if(dataActArray.get(0).size() > 1) {

                                results = new ArrayList<Object>();
                                startSimulations = System.currentTimeMillis();

                                MCSimulation mcs = new MCSimulation(numRepetitions, dataActArray);
                                acyclic = mcs.topologicalSort();

                                if(acyclic == 1) {

                                    System.out.println("Array (prima colonna) ordinato topologicamente:");
                                    mcs.printSortArray();
                                    mcs.makeInNodes();
                                    System.out.println();
                                    System.out.println("Matrice inNodes:");
                                    mcs.printInNodes();
                                    System.out.println();
                                    System.out.println("Array inDegree:");
                                    mcs.printInDegree();
                                    System.out.println();
                                    System.out.println();
                                    System.out.println("Array outDegree:");
                                    mcs.printOutDegree();
                                    System.out.println();
                                    System.out.println();
                                    results = mcs.simulations();
                                    stopSimulations = System.currentTimeMillis();

                                    DecimalFormatSymbols symb = new DecimalFormatSymbols();
                                    symb.setDecimalSeparator('.');
                                    DecimalFormat df = new DecimalFormat();
                                    df.setDecimalFormatSymbols(symb);
                                    df.setMaximumFractionDigits(3);

                                    timeSpentField.setText(""+((double)(stopSimulations-startSimulations)/1000));
                                    maxTotalDurField.setText(""+df.format(results.get(0)));
                                    sdField.setText(""+df.format(results.get(1)));
                                    for(int i=0; i<activitiesNumber; i++) {
                                        ((JTextField)activitiesArray.get(i).get(5)).setText(""+((int[])results.get(2))[i]);
                                    }

                                } else {

                                    stopSimulations = System.currentTimeMillis();
                                    JOptionPane.showMessageDialog(null,
                                        "<html><body>The following activities make a cyclical project!!!<br>" +
                                        "Please check all precedences in the activities!!!</body></html>", "Error", 
                                        JOptionPane.ERROR_MESSAGE);

                                }

                            } else {
                                System.out.println("Error: ci sono state delle eccezioni!");
                            }

                        }


                        pleaseWaitLabel.setVisible(false);

                        //Refresh MainPanel
                        repaint();
                    }
                };
            
            pleaseWaitLabel.setVisible(true);
                
            //Refresh MainPanel
            repaint();
            
            algorithmThread.start();
            
            }

Ultima modifica di pumax84 : 29-10-2008 alle 14:33.
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2008, 14:35   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Bene, ora, fossi in te, rifattorizzerei quel "bloccone" di codice che viene eseguito nel thread esterno, se non altro per migliorare la leggibilità.
Ciao

@EDIT:
Ehm, c'è ancora qualcosa di 'sporco': fai processare al thread esterno del codice AWT (ovvero quando setti la JLabel a non visibile). Come detto sopra: L'EDT è l'unico thread valido da cui poter aggiornare lo stato visibile dell'interfaccia grafica utente. Questo implica, tra l'altro, che aggiornare la grafica da altri thread diversi dall'EDT può essere causa di comportamenti anomali e funzionamenti non corretti dell'interfaccia grafica.

Per ovviare dovresti far accodare l'operazione nella AWT Event Queue, come? Usando il metodo SwingUtilities.InvokeLater(Runnable) a cui passi un thread (un Runnable) che puoi anche creare on the fly come hai fatto sopra, il cui scopo è appunto quello di invocare setVisible() sulla JLabel.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 29-10-2008 alle 14:50.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2008, 08:34   #9
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Bene, ora, fossi in te, rifattorizzerei quel "bloccone" di codice che viene eseguito nel thread esterno, se non altro per migliorare la leggibilità.
Ciao
Senza dubbio è da sistemare un pochino!

Quote:
Originariamente inviato da banryu79 Guarda i messaggi
@EDIT:
Ehm, c'è ancora qualcosa di 'sporco': fai processare al thread esterno del codice AWT (ovvero quando setti la JLabel a non visibile). Come detto sopra: L'EDT è l'unico thread valido da cui poter aggiornare lo stato visibile dell'interfaccia grafica utente. Questo implica, tra l'altro, che aggiornare la grafica da altri thread diversi dall'EDT può essere causa di comportamenti anomali e funzionamenti non corretti dell'interfaccia grafica.

Per ovviare dovresti far accodare l'operazione nella AWT Event Queue, come? Usando il metodo SwingUtilities.InvokeLater(Runnable) a cui passi un thread (un Runnable) che puoi anche creare on the fly come hai fatto sopra, il cui scopo è appunto quello di invocare setVisible() sulla JLabel.
Mmm... sinceramente non sono molto esperto di Thread & co. Potresti farmi un semplice esempio?

Ah, dato che ci siamo... Dovrei utilizzare QUESTA classe, in particolare il metodo nextDouble. Il problema è che tra i parametri c'è RandomStream (che è un'interfaccia)... Cosa dovrei passargli?
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2008, 08:51   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da pumax84 Guarda i messaggi
Mmm... sinceramente non sono molto esperto di Thread & co. Potresti farmi un semplice esempio?
be, per esempio:
Codice:
Runnable hideAndUpdate = new Runnable() 
{
    public void run() 
    {
          pleaseWaitLabel.setVisible(false);
          repaint();
    }
};
SwingUtilities.invokeLater(hideAndUpdate);
Quote:
Originariamente inviato da pumax84 Guarda i messaggi
Ah, dato che ci siamo... Dovrei utilizzare QUESTA classe, in particolare il metodo nextDouble. Il problema è che tra i parametri c'è RandomStream (che è un'interfaccia)... Cosa dovrei passargli?
Non lo so di preciso non conosco quella libreria, però dovrai probabilmente passargli una delle classi che implementano quella interfaccia.
Vai a vedere quali classi implementano RandomStream; ancora meglio trova, se esistono, tutorial ed esempi di utilizzo di quella libreria (magari partendo dal sito dove l'hai trovata).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2008, 09:00   #11
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
be, per esempio:
Codice:
Runnable hideAndUpdate = new Runnable() 
{
    public void run() 
    {
          pleaseWaitLabel.setVisible(false);
          repaint();
    }
};
SwingUtilities.invokeLater(hideAndUpdate);
Devo richiamare SwingUtilities.invokeLater(hideAndUpdate) dopo l'esecuzione dell'altro thread (ovvero algorithmThread.start())?

Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Non lo so di preciso non conosco quella libreria, però dovrai probabilmente passargli una delle classi che implementano quella interfaccia.
Vai a vedere quali classi implementano RandomStream; ancora meglio trova, se esistono, tutorial ed esempi di utilizzo di quella libreria (magari partendo dal sito dove l'hai trovata).
Ah perfetto, quindi devo vedermi le classi che la implementano! Capito, grazie mille!
pumax84 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2008, 10:29   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da pumax84 Guarda i messaggi
Devo richiamare SwingUtilities.invokeLater(hideAndUpdate) dopo l'esecuzione dell'altro thread (ovvero algorithmThread.start())?
Devi richiamarlo da dentro quel thread.
Provo a schematizzare:
Codice:
-> chiamata ActionListener            [thread corrente: EDT]
|
---> esecuzione algoritmo             [thread corrente: esterno]
|
---> nascondere JLabel                [thread corrente: esterno]

Da cui la neccessità di accodare nell'Event Queue (perchè così verrà 
eseguito dall'EDT) il codice che "nasconde" la label e richiede un repaint.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2008, 10:59   #13
pumax84
Member
 
L'Avatar di pumax84
 
Iscritto dal: Jun 2005
Messaggi: 99
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Devi richiamarlo da dentro quel thread.
Ah ecco... Io avevo già provato in quel modo, ma la dichiarazione/inizializzazione del Runnable la facevo esterna al Thread, di conseguenza mi indicava che non riconosceva la variabile... Sto fuso io...

Ora l'ho messa all'interno e sembra andare. Incollo il codice per una conferma sulla correttezza!

Codice:
            if(e.getSource() == computeButton) {
                
                Thread algorithmThread = new Thread() {
                    
                    @Override
                    public void run() 
                    {
                        Runnable hideAndUpdate = new Runnable() {
                            public void run() 
                            {
                                pleaseWaitLabel.setVisible(false);
                                repaint();
                            }
                        };

                        int numRepetitions = -1;
                        int acyclic = 0;

                        try {

                            if (getRepetitions() > 0)
                                numRepetitions = getRepetitions();
                            else
                            JOptionPane.showMessageDialog(null,
                                "<html><body>The format is not valid!<br>" +
                                "Please enter a positive integer<br>" +
                                "and less than 2147483648.</body></html>", "Error", 
                                JOptionPane.ERROR_MESSAGE);
                        }

                        catch(NumberFormatException exception) {

                            JOptionPane.showMessageDialog(null,
                                "<html><body>The format is not valid!<br>" +
                                "Please enter a positive integer<br>" +
                                "and less than 2147483648.</body></html>", "Error", 
                                JOptionPane.ERROR_MESSAGE);

                        }

                        if(numRepetitions > 0) {

                            ArrayList<ArrayList<Object>> dataActArray = new ArrayList<ArrayList<Object>>();
                            dataActArray = getDataAct();

                            if(dataActArray.get(0).size() > 1) {

                                results = new ArrayList<Object>();
                                startSimulations = System.currentTimeMillis();

                                MCSimulation mcs = new MCSimulation(numRepetitions, dataActArray);
                                acyclic = mcs.topologicalSort();

                                if(acyclic == 1) {

                                    System.out.println("Array (prima colonna) ordinato topologicamente:");
                                    mcs.printSortArray();
                                    mcs.makeInNodes();
                                    System.out.println();
                                    System.out.println("Matrice inNodes:");
                                    mcs.printInNodes();
                                    System.out.println();
                                    System.out.println("Array inDegree:");
                                    mcs.printInDegree();
                                    System.out.println();
                                    System.out.println();
                                    System.out.println("Array outDegree:");
                                    mcs.printOutDegree();
                                    System.out.println();
                                    System.out.println();
                                    results = mcs.simulations();
                                    stopSimulations = System.currentTimeMillis();

                                    DecimalFormatSymbols symb = new DecimalFormatSymbols();
                                    symb.setDecimalSeparator('.');
                                    DecimalFormat df = new DecimalFormat();
                                    df.setDecimalFormatSymbols(symb);
                                    df.setMaximumFractionDigits(3);

                                    timeSpentField.setText(""+((double)(stopSimulations-startSimulations)/1000));
                                    maxTotalDurField.setText(""+df.format(results.get(0)));
                                    sdField.setText(""+df.format(results.get(1)));
                                    for(int i=0; i<activitiesNumber; i++) {
                                        ((JTextField)activitiesArray.get(i).get(5)).setText(""+((int[])results.get(2))[i]);
                                    }

                                } else {

                                    stopSimulations = System.currentTimeMillis();
                                    JOptionPane.showMessageDialog(null,
                                        "<html><body>The following activities make a cyclical project!!!<br>" +
                                        "Please check all precedences in the activities!!!</body></html>", "Error", 
                                        JOptionPane.ERROR_MESSAGE);

                                }

                            } else {
                                System.out.println("Error: ci sono state delle eccezioni!");
                            }

                        }

                        SwingUtilities.invokeLater(hideAndUpdate);
                    }
                };
            
            pleaseWaitLabel.setVisible(true);
                
            //Refresh MainPanel
            repaint();
            
            algorithmThread.start();
            
            }
pumax84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Sempre più vicino il lancio (e il...
L'incredibile ottimizzazione di Battlefi...
La NASA aprirà il contratto per i...
PS5 Pro CFI-7121: ecco tutte le differen...
SpaceX ha raggiunto il traguardo dei 10....
ROG Xbox Ally e Ally X sono care, ma il ...
Intesa Sanpaolo: stop all'app Mobile su ...
Gli USA costruiscono chip AI… ma non pos...
Grazie a Ericsson, l'italia è in ...
CMF by Nothing Buds 2a: ANC da 42 dB e o...
Il futuro di Porsche è ibrido: il...
Apple lancia i nuovi MacBook Pro e iPad ...
Free software e biologia: intervista al ...
Dongfeng Box bocciata da Euro NCAP: solo...
Parigi abbandona ufficialmente Eurodrone...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v