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