Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-11-2008, 11:13   #1
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
[JAVA]Problemi basilari nelle progress bar: un aiuto per favore?

Salve a tutti,

mi è sempre rimasto oscuro il mondo delle progress bar perché dei dubbi mi attanagliano da sempre e non riesco a venirne fuori, anche guardando il Java Tutorial.

Quello che vorrei fare è mettere una progress bar (magari anche in popup) durante il caricamento della mia applicazione (un classico). Nella mia applicazione parte un form all'inizio e dopo un click su un JButton viene avviata la vera interfaccia grafica (che richiede un po' di tempo per esser caricata in memoria). Quì vorrei mettere la progress bar.

I problemi che ho sono:
1) Come faccio a sapere a priori quanto ci metterà a caricare, se devo impostare un avanzamento di una percentuale?

2) Come faccio a dirgli che deve partire dopo che ho premuto sul JButton e deve fermarsi quando l'applicazione è pronta?

3) Un'altro problema è che il JButton rimane premuto fino a che non ha finito di caricare in memoria tutto e la vera interfaccia non è comparsa. Pensavo all'utilizzo di un Thread, ma è questo il caso?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 12:53   #2
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
1) Come faccio a sapere a priori quanto ci metterà a caricare, se devo impostare un avanzamento di una percentuale?
Non puoi.
In passato ho considerato di suddividere il lavoro di costruzione dell'interfaccia
in vari task (ad esempio 10, creazione finestra principale, creazione dialog1, eccetera)
e al completamento di ogni task far avanzare la pbar di 1/10 (sempre ad esempio).
Non ti serve farlo in un thread separato, anzi e' meglio se lo fai sull'EDT.

Quote:
2) Come faccio a dirgli che deve partire dopo che ho premuto sul JButton e deve fermarsi quando l'applicazione è pronta?
Spiegati meglio.

Quote:
3) Un'altro problema è che il JButton rimane premuto fino a che non ha finito di caricare in memoria tutto e la vera interfaccia non è comparsa. Pensavo all'utilizzo di un Thread, ma è questo il caso?
se il pulsante e' nella stessa finestra della pbar ti consiglio di disabilitarlo,
altrimenti chiudi la finestra con il pulsante (non ha piu' senso)
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 13:29   #3
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da lovaz Guarda i messaggi
Non puoi.
In passato ho considerato di suddividere il lavoro di costruzione dell'interfaccia
in vari task (ad esempio 10, creazione finestra principale, creazione dialog1, eccetera)
e al completamento di ogni task far avanzare la pbar di 1/10 (sempre ad esempio).
Non ti serve farlo in un thread separato, anzi e' meglio se lo fai sull'EDT.
Ok, grazie, punto 1 chiarito.
Quote:
Originariamente inviato da lovaz Guarda i messaggi

Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
2) Come faccio a dirgli che deve partire dopo che ho premuto sul JButton e deve fermarsi quando l'applicazione è pronta?

Spiegati meglio.
Dunque, riepilogando la situazione è questa: quando la mia applicazione parte, mi chiede di fare login (e quindi la prima ed unica cosa a partire è una semplice maschera con pochissime cose e un JButton OK che serve ad inviare i dati di login e autenticarsi). Una volta inseriti username e password se l'autenticazione (con il database) è andata a buon fine provvede a lanciare la vera interfaccia. Per lanciare questa interfaccia ci vuole un po' di tempo. Per tutto questo tempo (tempo di autenticazione + tempo di caricare in memoria tutta la GUI principale) il JButton OK resta premuto. Quindi in teoria dovrei fare in modo innanzitutto che l'avvio della GUI principale dopo il form di login avvenisse a "JButton released (o UP)" e che la progress bar partisse (solo che non ci riesco), per poi terminare la sua "visualizzazione" al termine del caricamento. Spero di esser stato più preciso ora.
Quote:
Originariamente inviato da lovaz Guarda i messaggi


se il pulsante e' nella stessa finestra della pbar ti consiglio di disabilitarlo,
altrimenti chiudi la finestra con il pulsante (non ha piu' senso)
No.. Non devo nè posso disabilitarlo. Non capisco il perché dovrei farlo sinceramente.

Grazie per il supporto.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 13:47   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Per il discorso del bottone che "rimane premuto" (in sostanza il repaint schedulato non viene eseguito in tempo, cioè prima di tutto l'ambaradam di codice che apre l'interfaccia principale e che, come il repaint del bottone, sarà eseguito nel contesto dell'EDT [se l'interfaccia è in AWT/Swing, come credo]) puoi risolvere in questo modo, se le premesse son quelle che seguono:
- il processo che fa partire l'ambaradam di cui sopra è invocato nell'actionPerformed() del tuo Button.

Prova questo, nell'actionPerformed del button:
Codice:
public void actionPerformed(ActionEvent e)
{
    Runnable buildInterface = new Runnable()
    {
        public void run()
        {
            // ... 
            // ... codice di costruzione dell'interfaccia principale
            // ... 
        } 
    };
    SwingUtilities.invokeLater(buildInterface);
}
In questo modo, dato che nel metodo actionPerformed ti trovi già nel contesto dell'EDT, eviti di far eseguire immediatamente (cioè prima di uscire dal metodo actionPerformed del Button) "codice Swing/AWT" (che viene appunto eseguito subito nell'EDT, di fatto costruendo l'interfaccia, e solo dopo, perchè si esce dal metodo actionPerformed, schedulando il repaint del button) per la costruzione della tua interfaccia che sarà invece "appeso" agli eventi che l'EDT dovrà processare, uscendo così da actionPerformed e permettendo l'aggiornamento del Button (e magari la chiusura della finestra in cui si trova) prima dell'esecuzione effettiva della costruzione dell'interfaccia principale.

Questo se ho capito bene la faccenda, il che non è scontato, eheh
__________________

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 : 13-11-2008 alle 13:50.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 14:09   #5
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Perfetto! Grazie banryu79!
Ora è una scheggia..
Non resta che mettere una JProgressBar o un cursore di attesa nel momento che intercorre fra il dispose della JDialog di login e la comparsa della GUI principale.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 14:23   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
De nada
Per il futuro, se hai problemi simili considera che questo know how lo reperisci facilmente nel sito java.sun (ovviamente in inglese).
__________________

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 13-11-2008, 16:06   #7
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Stavo pensando ad una cosa: è possibile lanciare una JProgress bar in indeterminate mode, subito prima che parta l'inizializzazione di tutta la GUI, e disattivarla non appena inizializzata?
Che dite, può funzionare come idea?

Perché in caso la metterei direttamente nella mia funzione initialize() della GUI.
__________________
^ThE CyBoRg^

Ultima modifica di fbcyborg : 13-11-2008 alle 16:57.
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 16:34   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Stavo pensando ad una cosa: è possiile lanciare una JProgress bar in indeterminate mode...
Ah, però, non le conoscevo... si tratta di questo?
__________________

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 13-11-2008, 16:59   #9
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Esistono due tipi di JProgressBar: quelle con la percentuale e quelle indeterminate .
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 17:12   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Mi pare proprio che la seconda faccia al caso tuo.
La fai partire non appena lanci il processo di costruzione della GUI, e la spegni al completamento di tale processo che quando ha finito le fa un fischio.
__________________

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 13-11-2008, 19:21   #11
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Come ha detto lovaz puoi suddividere i vari momenti del caricamento in fasi ed incrementare la barra di progresso in base alla fase in cui il caricamento si trova.

Ovviamente per funzionare la barra la fase di caricamento e di login deve essere eseguita in un thread diverso dall'event dispatching thread .

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 19:27   #12
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
E' possibile mettere una scritta lampeggiante nella progress bar del tipo "Caricamento ..." ?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 19:31   #13
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Beh, JProgressBar ha un metodo setString() e se non sbaglio puoi anche impostare stili di barre personalizzati, quindi dovrebbe essere abbastanza costumizzabile, però io personalmente non l'ho mai fatto, quindi più di così non so

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 19:37   #14
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
il setString() l'avevo provato ma non funziona. Per caso bisogna metterlo in un ciclo e farglielo fare ad ogni iterazione?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 19:40   #15
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
il setString() l'avevo provato ma non funziona. Per caso bisogna metterlo in un ciclo e farglielo fare ad ogni iterazione?
Prova a dare anche un "setStringPainted(true)"

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2008, 19:43   #16
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Grazie! Ha funzionato!!!

__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2008, 17:15   #17
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Ho usato il sistema proposto da banryu79, ovvero il seguente codice per risolvere il problema del tasto OK che rimaneva premuto:
Codice:
public void actionPerformed(ActionEvent e)
{
    Runnable buildInterface = new Runnable()
    {
        public void run()
        {
            // ... 
            // ... codice di costruzione dell'interfaccia principale
            // ... 
        } 
    };
    SwingUtilities.invokeLater(buildInterface);
}
Ora in effetti, premuto OK, il thread parte e lancia l'interfaccia grafica principale.
Ora vorrei riuscire a far visualizzare una JProgressBar indeterminata in uno dei due seguenti modi, e deve essere visualizzata nel tempo che intercorre fra la pressione del tasto OK e la comparsa della GUI principale.
Ho fatto diverse prove ma non sono ancora riuscito a trovare il modo giusto.

1) JProgressBar che viene visualizzata come popup, dopo che si è premuto il tasto OK e che quindi il form di login è scomparso
2) JProgressBar che è incorporata nel form di login e che viene visualizzata solo quando si preme OK (quindi sempre in fase di caricamento). Quì però il problema è che appena si preme OK, faccio una dispose() del JDialog (ok, potrei toglierlo, e farlo fare alla GUI principale alla fine della sua inizializzazione.

Che consigli potete darmi?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2008, 17:40   #18
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Usa un altro Runnable, che chiamiamo "showProgression", così lo puoi accodare nell'EDT prima di "buildInterface".

Naturalmente devi passare a "buildInterface" una reference che punti al componente grafico da lanciare in "showProgression" in modo da poter fermare la ProgressBar e chiudere la relativa finestra appena la GUI è inizializzata (cioè al termine del processo definito in "buildInterface")

A questo punto ti potresti definire i due Runnable come classi al di fuori del metodo actionPerformed, che si limiterà a schedulare correttamente i due "task":
Codice:
public void actionPerformed(ActionEvent e)
{
    // costruisce "showProgression" e lo accoda nell'EDT
    ShowProgression progressionFrame = new ShowProgression();
    SwingUtilities.invokeLater(progressionFrame);
     
    // costruisce "buildInterface", passa riferimento al "showProgression"
    // da chiudere al completamento e lo accoda nell'EDT
    SwingUtilities.invokeLater(new BuildInterface(progressionFrame));
}
Il codice è di puro esempio per illustrare il concetto.

- ShowProgression è una classe che estende JFrame o JDialog (per la versione popup della ProgressBar) e implementa Runnable (così è accodabile come thread da eseguire nell'EDT)

- BuildInterface è una classe che semplicemente estende Thread oppure implementa Runnable.
__________________

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 14-11-2008, 17:45   #19
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Ok, prima di provare ho una domanda ancora: le due classi che implementano runnable, devono implementare il metodo run(). All'interno però non ci scrivo nulla giusto?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2008, 18:09   #20
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Eh no, all'interno dei due metodi run() devi proprio metterci il codice che deve essere eseguito.

Riferendomi al problema di lanciare la costruzione dell'interfacica, ad esempio:
Codice:
class BuildInterface implements Runnable
{
    private ShowProgression progression;
    
    public BuildInterface(ShowProgression sp)
    { 
        progression = sp;
        //...
    }

    public void run()
    {
        // ... 
        // ... codice di costruzione dell'interfaccia principale
        // ... "chiudere" progression alla fine
    } 
};
Per ShowProgression, ad esempio:
Codice:
class ShowProgression extends JFrame implements Runnable
{
   
    // membri di ShowProgression...
    
    public ShowProgression()
    {
         //... costruttore, costruisci l'interfaccia via codice
         //... operazioni classiche, istanziazione componenti, 
         // setting dei LayoutManager, creazione e setting della JProgressBar
         //... ecc...
    }

    public void run()
    {
         // ...
         // ...codice di realizzazione del JFrame e dei suoi componenti (setVisible)
         // ...attivazione della progress bar
         // ...
    }
}
Spero sia più chiaro, e spero sia esatto perchè sono di fretta, sto staccando dall'ufficio!
__________________

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
 Rispondi


Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Meta avrebbe scaricato illegalmente migl...
QNAP annuncia la funzionalità di ...
Fino a 96 core per chip: la nuova CPU se...
Robot che crescono mangiando i loro simi...
Star Wars Outlaws 2 cancellato: per Ubis...
F1 senza freni: il film supera i 500 mil...
Una supersportiva elettrica da 429 CV a ...
Denodo DeepQuery: ricerche complesse in ...
Pluribus è la nuova ambiziosa ser...
IA come persone: avranno una personalit&...
Scoppia la bufera NSFW: la mano di Colle...
Philips porta OneBlade su Fortnite: arri...
Il consumo dei data center AI esplode: r...
Dimenticate tutto quello che avete visto...
Prodotti illegali su Temu: l'UE avvia pr...
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: 17:33.


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