Ciao, stavo creando un'applicazione che cerca i dispositivi Bluetooth e siccome la ricerca dura un po' di tempo, volevo potenziare il JFrame con un JProgressBar che si animava (si vedeva scorrere il "pulsantino"). Però con i Thread è una cosa (quasi) impossibile: non riesco ad arginare il problema.
Ho cercato in rete, ci sono cose utili ma non riesco ad implementarle secondo il mio volere. Vi ringrazio di cuore per l'aiuto e allego il tutto (progetto fatto in Eclipse).

Se vi occorre avere il jar per la gestione del bluetooth in java, ecco qui il URL: http://code.google.com/p/bluecove/downloads/list

Ecco qui il codice:
codice:
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;
	private Thread avanzamentoBarra;
	
	/**
	 * 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();
		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);
	}

}
codice:
package mercurio;

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

/**
 * 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() throws IOException, InterruptedException 
    {
    	System.gc();
        final Object inquiryCompletedEvent = new Object();
        devicesDiscovered.clear();
        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();
                }
            }

            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;
    }

}
codice:
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);
	}
	
}
codice:
package mercurio;

import java.awt.event.*;

public class ChiudiProgramma extends MouseAdapter
{	
	public void mouseClicked(MouseEvent ogg)
	{
		System.exit(0);
	}
	
}
codice:
import javax.bluetooth.RemoteDevice;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

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;
	
	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();
		}
			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;
	}

}
codice:
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); 
		}
	}
	
}
Grazie a tutti di cuore, cercherò di imparare da ciò che ho sbagliato