|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Thread,Timer e Swing in java
Ciao a tutti. Il mio problema è semplice. Devo usare un Timer ma mi da errore "cannot find symbol constructor Timer(int, ActionListener)".
Questa è la classe che implementa ActionListener: import java.awt.event.ActionEvent; public class ricevitore implements ActionListener{ private int secondi; public ricevitore(int sec){ secondi = sec; } public void actionPerformed(ActionEvent event){ if(secondi>0) System.out.println(secondi); if(secondi==0) System.out.println("VIA!!!"); secondi--; } } Nella classe in cui devo usare il Timer ho messo queste istruzioni: ActionListener ric = new ricevitore(secondi); Timer time = new Timer(1000, ric); La classe Timer l'ho importata ma mi da sempre l'errore. Perchè? Ultima modifica di boysna : 06-04-2006 alle 16:49. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2005
Città: Napoli (provincia)
Messaggi: 2363
|
Questa è RicevitoreTest.java
Codice:
import java.awt.event.*; import javax.swing.JOptionPane; import javax.swing.Timer; public class RicevitoreTest { /** * @param args */ public static void main(String[] args) { int secondi = 5; ActionListener ric = new Ricevitore(secondi); Timer time = new Timer(1000, ric); time.start(); JOptionPane.showMessageDialog(null,"In attesa di eventi..."); System.exit(0); } } Codice:
import java.awt.event.*; public class Ricevitore implements ActionListener{ private int secondi; public Ricevitore(int sec){ secondi = sec; } public void actionPerformed(ActionEvent event){ if(secondi>0) System.out.println(secondi); if(secondi==0) System.out.println("VIA!!!"); secondi--; } }
__________________
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Scusa ma non capisco l'utilità del test... Come risolvo il mio problema?
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Ho eseguito il tuo programma e funziona.
ma non capisco perchè nel mio non funziona. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2005
Città: Napoli (provincia)
Messaggi: 2363
|
Il test è semplicemente la classe che contiene il main... un nome dovevo darglielo...
Il timer andava "lanciato" (riga time.start(); ) Il programma non doveva terminare (per questo metto il messaggio a video "In attesa di eventi") altrimenti stoppa anche il timer
__________________
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Ma non credo che è per questo che non trova il costruttore Timer...
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Non so perchè spostando il file in un'altra directory, ra mi da l'errore anche sul tuo main.
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Sono riuscito a risolvere specificando il metodo actionPerformed direttamente nella classe dove devo instanziare il Timer.
Ora il problema è che on riesco a sincronizzare... Il mio scopo è quello di far partire il timer ad ogni passo del seguente ciclo for (int j=0;j<numSessioni;j++){ Ho messo una wait in quanto il resto del codice deve essere eseguito dopo che il timer ha fatto la notify(), che viene lanciata quando secondi==0. Purtropo non riesco a realizzare questa cosa perchè mi lancia tante eccezioni. import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.JOptionPane; import javax.swing.Timer; import java.awt.event.ActionListener; public class OccupaSedia extends Thread{ private boolean flag; private int numPersone,numSedie,numSessioni,numThread, secondi; private int[] arrayPunteggio; private String[] arrayPersone; private Sedia[] arraySedie; Timer time; Object a = "3"; public OccupaSedia(int numPersone, int numSedie, int numSessioni, int s){ this.numPersone = numPersone; this.numSedie = numSedie; this.numSessioni = numSessioni; this.secondi = s; //Creazione Timer this.time = new Timer(1000,new ActionListener() { public void actionPerformed(ActionEvent event) { synchronized(arraySedie){ if(secondi>0){System.out.println(secondi);} if(secondi==0){System.out.println("VIA!!!");a.notify();} secondi--;} } }); setFlag(false); //inizializzazione punteggio arrayPunteggio=new int[numPersone]; for (int i=0;i<numPersone;i++) arrayPunteggio[i]=0; arrayPersone=new String[numPersone]; //inizializzazione persone for (int i=0;i<numPersone;i++) arrayPersone[i]="persona"+i; arraySedie=new Sedia[numSedie]; //inizializzazione sedie for (int i=0;i<numSedie;i++) arraySedie[i]=new Sedia(false,"","sedia"+i); Thread t=null; for (int j=0;j<numSessioni;j++){ azzeraNumThread(); time.start(); try{a.wait();} catch(InterruptedException e){} System.out.println("SESSIONE "+ j); //avvia threads della sessione for (int i=0;i<numPersone;i++){ t=new Thread(this); t.setName(Integer.toString(i)); t.start(); } setFlag(true); while(isFlag()==true){} //libera le sedia a fine sessione for (int i=0;i<numSedie;i++) arraySedie[i].setOccupata(false); } stampaPunteggio(); System.out.println("GIOCO FINITO"); } public void run(){ int n=threadContemporanei(); synchronized(arraySedie){ int i=0; //cerca una sedia libera if (!arraySedie[arraySedie.length-1].isOccupata()) {while((arraySedie[i].isOccupata()) && (i<arraySedie.length)) i++; //occupa la sedia trovata libera if (i<arraySedie.length) { arraySedie[i].setOccupata(true); arraySedie[i].setOccupante(arrayPersone[n]); arrayPunteggio[n]++; System.out.println(arraySedie[i].getOccupante()+" ha occupato la sedia "+ arraySedie[i].getNomeSedia()); } } else //se non è stata trovata una sedia libera... { System.out.println(arrayPersone[n]+" è rimasto in piedi"); } }} //fa partire i threads della sessione "contemporaneamente" public synchronized int threadContemporanei(){ int n=getNumThread(); setNumThread(); try{ if (numThread!=numPersone){ wait();} else { notifyAll();} }catch(InterruptedException e){ System.out.println ("Si è verificato un errore: " + e); System.exit(-1);} return n; } //stampa la classifica public void stampaPunteggio(){ System.out.println("CLASSIFICA"); for(int i=0;i<arrayPunteggio.length;i++) System.out.println(arrayPersone[i]+": "+arrayPunteggio[i]); setFlag(false); System.out.println(); //System.out.println(isFlag()); } /** * @return Returns the numThread. */ public synchronized int getNumThread() { return numThread; } /** * @param numThread The numThread to set. */ public synchronized void setNumThread() { this.numThread++; } /** * @return Returns the numThread. */ public synchronized String getNomePersona() { return arrayPersone[getNumThread()]; } public synchronized void azzeraNumThread() { this.numThread=0; } /** * @param flag The flag to set. */ public synchronized void setFlag(boolean flag) { this.flag = flag; } /** * @return Returns the flag. */ public synchronized boolean isFlag() { return flag; } } |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2005
Città: Napoli (provincia)
Messaggi: 2363
|
Senti ti trovi metti pure la classe Sedia se no non posso provare nulla, oppure me la mandi in email (raffaele@terzigno.com)
__________________
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Mar 2004
Città: castel san giorgio(salerno)
Messaggi: 1218
|
Sono riuscito a sincronizzare, ora come faccio a fare in modo che tutte le stampe che fa il codice vengano stampate in un pannello che sta in un frame?
Io ho pensato di fare cosi: creo il frame iniziale //Creazione del frame JFrame frame = new JFrame(); Toolkit kit = Toolkit.getDefaultToolkit(); Dimension dimensioniSchermo = kit.getScreenSize(); frame.setSize(dimensioniSchermo); frame.setTitle("Compito numero 3"); //Creazione pannello Panel pannello = new Panel(); pannello.messaggio = ""; frame.setContentPane(pannello); frame.show(); e ogni qualvolta che devo stampare faccio: pannello.messaggio = pannello.messaggio + stringa_da_stampare + "\n" ; frame.setContentPane(pannello); frame.show(); La classe Panel è questa: public class Panel extends JPanel { public int MESSAGE_X = 75; public int MESSAGE_Y = 100; public String messaggio = ""; public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString(messaggio, MESSAGE_X, MESSAGE_Y); } } Purtropo non va da capo. Perchè? |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Feb 2005
Città: Napoli (provincia)
Messaggi: 2363
|
1 ti consiglio di usare il tag [ CODE ] per includere il codice così ti mantiene l'indentazione. Ti segnalo un errore formale ma anche pratico. Tu usi la stringa pubblica messaggio a cui in teoria tutti i thread dovrebbero accedere... Io farei così invece.
Codice:
import java.awt.Graphics; import java.util.Vector; import javax.swing.JPanel; public class Panel extends JPanel { private static int spostamento = 15; private Vector messaggi; private int MESSAGE_X = 75; private int MESSAGE_Y = 100; public Panel() { messaggi = new Vector(); } public void aggiungiMessaggio(String messaggio) { messaggi.addElement(messaggio); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i=0; i<messaggi.size(); i++) { g.drawString((String) messaggi.elementAt(i), MESSAGE_X, MESSAGE_Y + (i*spostamento)); } } } Codice:
import javax.swing.*; import java.awt.*; public class PanelTest { public static void main(String[] args) { JFrame frame = new JFrame(); Toolkit kit = Toolkit.getDefaultToolkit(); Dimension dimensioniSchermo = kit.getScreenSize(); frame.setSize(dimensioniSchermo); frame.setTitle("Compito numero 3"); Panel pannello = new Panel(); frame.setContentPane(pannello); frame.show(); pannello.aggiungiMessaggio("messaggio 1"); pannello.aggiungiMessaggio("messaggio 2"); pannello.aggiungiMessaggio("messaggio 3"); pannello.aggiungiMessaggio("messaggio 4"); frame.setContentPane(pannello); frame.show(); } }
__________________
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:12.