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; } }Grazie a tutti di cuore, cercherò di imparare da ciò che ho sbagliatocodice: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); } } }![]()

Rispondi quotando