Oppure

Loading
16/07/10 16:16
Moon Knight
Ciao, nel prossimo programma che a breve pubblicherò qui nel forum, avrei bisogno di un aiutino. Vi spiego velocemente: ho creato un semplice programma che permette di trovare dispositivi bluetooth. Siccome la ricerca impiega molti secondi, volevo avviare una JProgresBar che, finito tutto, tornava inattiva. Ho visto che si richiede la gestione dei Thread: ma dove lo devo mettere l'oggetto di tipo Thread??? Nella parte del programma principale oppure nella classe che ascolta gli eventi della pressione del pulsante di ricerca? O in altri posti? Vi ringrazio moltissimo per l'aiuto! :)
Allego qui i file:
Per il bluetooth, scaricate "bluecove" da qui: code.google.com/p/bluecove/downloads/…
e poi il progetto (in Eclipse) in allegato.
Grazie ancora! :k:
Ultima modifica effettuata da Moon Knight 16/07/10 16:19
aaa
16/07/10 18:11
paoloricciuti
Beh puoi scegliere tu, potresti fare un Classe che implementi Runnable al quale bisogna passare un'oggetto di tipo JProgressBar e uno di tipo "La classe che hai usato tu per ricercare i dispositivi" e quindi fai fare tutto nel Thread. Oppure potresti creare la classe Runnable come inner class dell'interfaccia Grafica e quindi avresti bisogno di un metodo nella classe che ricerca i dispositivi che ti dica a che livello percentuale si trova la scansione. Potresti farla come innerclass della classe che ricerca i dispositivi e farti passare la progress bar sul quale lavorare nel costruttore di questa classe. Hai infinite possibilità!!
aaa
16/07/10 18:29
Moon Knight
Ti ringrazio per le infinite opportunità ma proprio non riesco: avevo tentato di fare altre classi ma avevo il problema dell'aggiornamento del JProgressiveBar
Se vuoi dare un'occhiata al codice lo trovi qui:
forum.html.it/forum/…
Ho postato tutto il codice, vedendolo meglio capisci i miei problemi.
Grazie ancora per la risposta :)
aaa
16/07/10 18:52
paoloricciuti
Ma tu in base a cosa la vuoi far scorrere questa progress bar? O meglio: sai dopo quanto tempo si ferma la ricerca dei dispositivi??
aaa
17/07/10 8:31
Moon Knight
Ciao, scusa se mi sono spiegato male: quando l'utente clicca sul pulsante "ricerca dispositivi" viene attivata una animazione da parte della JProgressBar (l'istruzione che avviene è <barraProgressiva.setIndeterminate(true)>;). Tutta questa animazione dura tutta la ricerca dei dispositivi (cioè fino alla fine del metodo relativo al click del mouse).
L'istruzione"setIndeterminate(true)" viene utilizzata quando non si sa il tempo che ci impiega il computer per eleborare i dati.
Quindi l'utente clicca sul pulsante, poi viene fatta la ricerca dei dispositivi in contemporanea con l'animazione della barra progressiva, una volta concluso la ricerca, l'animazione si ferma.
Secondo te come dovrei operare? :)
aaa
17/07/10 11:39
paoloricciuti
Allora molto semplicemente fatti passare la progress bar nel costruttore della classe RemoteDeviceDiscovery. In questa classe nel metodo inquiryCompleted inserisci jProgressBar.setIndeterminate(false);
aaa
17/07/10 12:02
Moon Knight
Ti ringrazio, ma purtroppo provando (seguendo i tuoi consigli) non funziona:
# la class RemoteDevices non ha costruttore (sono tutti static)
# ho tentato di far passare la barra tra le classi ma l'animazione non parte.

Ecco il testo per farti capire come ho operato

[CODE]
package mercurio;

import java.awt.*;
import javax.swing.*;

public class Mercurio extends JFrame implements Runnable
{
    private static final long serialVersionUID = 1L;
    private final String TITOLO_APPLICAZIONE =    "Mercurio";
    private final String nomeIconaFrame =        "icone//iconaProgrammaPrincipale.gif";
    private JPanel jContentPane;
    private Pulsante avviaRicerca;
    private Pulsante chiudiProgramma;
    private BarraScorrimento barre;
    private JTextArea areaTesto;
    private JProgressBar barraProgressiva;
    private CercaDispositivi classCercaDispositivi;
    private ChiudiProgramma classChiudiProgramma;
    
    /**
     * Costruisce il pulsante "Avvia ricerca"
     */
    private Pulsante creaAvviaRicerca()
    {
        final String AVVIA_RICERCA =     "Ricerca dispositivi";
        final String nomeFile =            "icone//avviaRicerca.gif";
        return (new Pulsante(AVVIA_RICERCA, nomeFile));
    }
    
    /**
     * Costruisce il pulsante "Chiudi Programma"
     */
    private Pulsante creaChiudiProgramma()
    {
        final String CHIUDI_PROGRAMMA =         "Chiudi programma";
        final String nomeFile =                    "icone//chiudiProgramma.gif";
        return (new Pulsante(CHIUDI_PROGRAMMA, nomeFile));
    }
    
    /**
     * Costruisce l'area di testo
     */
    private JTextArea creaAreaTesto()
    {
        areaTesto = new JTextArea(20, 40);
        areaTesto.setEditable(false);
        return areaTesto;
    }
    
    /**
     * Costruisce le barre di scorrimento
     */
    private BarraScorrimento creaBarraScorrimento(JTextArea area)
    {
        barre = new BarraScorrimento(area, true, true);
        return barre;
    }
    
    /**
     * Costruisce la barra di avanzamento
     */
    private JProgressBar creaBarraProgressiva()
    {
        final int min = 0;
        final int max = 0;
        barraProgressiva = new JProgressBar(min, max);
        return barraProgressiva;
    }
    
    /**
     * Delegazione degli eventi ai pulsanti
     */
    private void delegazioneEventi()
    {
        classCercaDispositivi = new CercaDispositivi(barraProgressiva);
        classChiudiProgramma = new ChiudiProgramma();
        avviaRicerca.addMouseListener(classCercaDispositivi);
        chiudiProgramma.addMouseListener(classChiudiProgramma);
    }
    
    /**
     * @param args Variabili di entrata (non necessarie)
     */
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Mercurio thisClass = new Mercurio();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    /**
     * This is the default constructor
     */
    public Mercurio()
    {
        super();
        initialize();
    }

    /**
     * This method initializes this
     *
     * @return void
     */
    private void initialize()
    {
        this.setName(TITOLO_APPLICAZIONE);
        this.setTitle(TITOLO_APPLICAZIONE);
        this.setSize(500, 500);
        Image icona = Toolkit.getDefaultToolkit().getImage(nomeIconaFrame);
        this.setIconImage(icona);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setContentPane(getJContentPane());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        delegazioneEventi();
    }

    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane()
    {
        if (jContentPane == null)
        {
            jContentPane = new JPanel();
            jContentPane.setLayout(new FlowLayout());
            avviaRicerca = creaAvviaRicerca();
            chiudiProgramma = creaChiudiProgramma();
            areaTesto = creaAreaTesto();
            barre = creaBarraScorrimento(areaTesto);
            barraProgressiva = creaBarraProgressiva();
            jContentPane.add(avviaRicerca);
            jContentPane.add(chiudiProgramma);
            jContentPane.add(barre);        
            jContentPane.add(barraProgressiva);
        }
        return jContentPane;
    }

    @Override
    public void run()
    {
        if(classCercaDispositivi.isAvviato() == true)
        barraProgressiva.setIndeterminate(true);
        else
            barraProgressiva.setIndeterminate(false);
    }

}
[/CODE]

[CODE]
package mercurio;

import java.io.*;
import java.util.*;
import javax.bluetooth.*;
import javax.swing.*;

/**
* Minimal Device Discovery example.
*/
public class RemoteDeviceDiscovery
{
    private static final long serialVersionUID =             1L;
private static final Vector<RemoteDevice> devicesDiscovered = new Vector<RemoteDevice>();

public static Vector<RemoteDevice> search(final JProgressBar barra) throws IOException, InterruptedException
{
    System.gc();
final Object inquiryCompletedEvent = new Object();
devicesDiscovered.clear();

barra.setIndeterminate(true);

DiscoveryListener listener = new DiscoveryListener()
{

public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
{
System.out.println("Dispositivo " + btDevice.getBluetoothAddress() + " trovato";);
devicesDiscovered.addElement(btDevice);
try
{
System.out.println("\tNome " + btDevice.getFriendlyName(false));
} catch (IOException cantGetDeviceName)
    {
        System.out.println("Impossibile reperire il nome friendly del dispositivo";);
    }
}

public void inquiryCompleted(int discType)
{
System.out.println("Interrogazione completata!";);
synchronized(inquiryCompletedEvent)
{
inquiryCompletedEvent.notifyAll();
}
barra.setIndeterminate(false);
}

public void serviceSearchCompleted(int transID, int respCode)
{
    //Da implementare, eventualmente
}

public void servicesDiscovered(int transID, ServiceRecord[] servRecord)
{
    //Da implementare, eventualmente
}
};

synchronized(inquiryCompletedEvent)
{
boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, listener);
if (started)
{
System.out.println("Attendere, ricerca in corso...";);
inquiryCompletedEvent.wait();
System.out.println(devicesDiscovered.size() + " dispositivi trovati";);
}
}
return devicesDiscovered;
}

}
[/CODE]

[CODE]
package mercurio;

import java.io.*;
import java.awt.event.*;
import java.util.*;

import javax.bluetooth.RemoteDevice;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class CercaDispositivi extends MouseAdapter
{
    private final String TITOLO =            "Mercurio";
    private final String nomeIconaFrame =    "icone//iconaProgrammaPrincipale.gif";
    private Vector<RemoteDevice> devicesDiscovered;
    private boolean avviato = false;
    private JProgressBar barraAvanzamento;
    
    public CercaDispositivi(JProgressBar barra)
    {
        barraAvanzamento = barra;
    }
    
    public boolean isAvviato()
    {
        return avviato;
    }
    
    public void mouseClicked(MouseEvent ogg)
    {
        avviato = true;
        final String ERRORE_INTERRUPT =                "La ricarca è stata interrotta";
        final String ERRORE_IO =                    "Non si riesce più a ricevere dati";
        final String ERRORE_GENERICO =                "Errore irreversibile";
        final String NESSUN_DISPOSITIVO =            "Nessun dispositivo presente";
        ImageIcon icona = new ImageIcon(nomeIconaFrame);
        try
        {
            devicesDiscovered = RemoteDeviceDiscovery.search(barraAvanzamento);
        }
            catch (InterruptedException e)
            {
                JOptionPane.showMessageDialog(null, ERRORE_INTERRUPT, TITOLO, JOptionPane.ERROR_MESSAGE, icona);
                e.printStackTrace();
            }
            catch (IOException e)
            {
                JOptionPane.showMessageDialog(null, ERRORE_IO, TITOLO, JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
            catch (Throwable e)
            {
                JOptionPane.showMessageDialog(null, ERRORE_GENERICO, TITOLO, JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        if(devicesDiscovered == null)
        {
            JOptionPane.showMessageDialog(null, NESSUN_DISPOSITIVO, TITOLO, JOptionPane.INFORMATION_MESSAGE);
        }
        avviato = false;
    }

}
[/CODE]

[CODE]
package mercurio;

import java.awt.event.*;

public class ChiudiProgramma extends MouseAdapter
{    
    public void mouseClicked(MouseEvent ogg)
    {
        System.exit(0);
    }
    
}
[/CODE]

[CODE]

package mercurio;

import javax.swing.*;

public class Pulsante extends JButton
{    
    private static final long serialVersionUID =             1L;
    
    public Pulsante(String testo, String urlIcona)
    {
        ImageIcon icona = new ImageIcon(urlIcona);
        this.setText(testo);
        this.setIcon(icona);
    }
    
}
[/CODE]

[CODE]

package mercurio;

import javax.swing.*;

public class BarraScorrimento extends JScrollPane
{    
    private static final long serialVersionUID =             1L;
    
    public BarraScorrimento(JTextArea areaTesto)
    {
        this.setViewportView(areaTesto);
        this.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
        this.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
    }
    
    public BarraScorrimento(JTextArea areaTesto, boolean scrollHorrizonatl, boolean scrollVertical)
    {
        this.setViewportView(areaTesto);
        if(scrollHorrizonatl == true)
            {
                this.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_ALWAYS);
            }
        if(scrollVertical == true)
        {
            this.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
        }
    }
    
}
[/CODE]

Scusami se sono pesanti, ma preferisco farti capire fino in fondo tutto l'argomento! :)
aaa
18/07/10 11:47
Moon Knight
Ah, ti volevo aggiornare: ho tentavo a fare come mi hai detto, ma non riesco proprio a far partire l'animazione. Maledetti thread! :grr:
aaa