Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Gara auto con thread

  1. #1

    Gara auto con thread

    Buonasera,
    Sto credando un programma per fare una gara tra 4 auto utilizzando i thread.
    solo che mi da un errore nel codice e non so come risolverlo
    lerrore e in questa istruzione:
    codice:
    auto auto1=new auto(bottone1,y[0]);
    probabilmente sara anche nelle 3 istruzioni successive ho provato a usare il final ma nulla
    codice:
    package gara;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Random;
    
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JButton;
    import javax.swing.ImageIcon;
    import java.awt.Color;
    import javax.swing.SwingConstants;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class gara extends JFrame {
    
    
        private JPanel contentPane;
    
    
    
    
    
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        gara frame = new gara();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            
        }
    
    
        /**
         * Create the frame.
         */
        public gara() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 866, 652);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(null);
            setContentPane(contentPane);
            String immagine="http://images.clipartpanda.com/car-top-view-clipart-red-racing-car-top-view-fe3a.png";
            int y[]=new int[4];
            JButton bottone1 = null;
            try {
                bottone1 =new JButton("Regular",new ImageIcon(new URL(immagine)));
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            bottone1.setBounds(10, 11, 130, 95);
            contentPane.add(bottone1);
            
            JButton bottone2 = null;
            try {
                bottone2 =new JButton("Regular",new ImageIcon(new URL(immagine)));
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bottone2.setBounds(10, bottone1.getY()+130, 130, 95);
            contentPane.add(bottone2);
            JButton bottone3 = null;
            try {
                bottone3 =new JButton("Regular",new ImageIcon(new URL(immagine)));
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bottone3.setBounds(10, bottone2.getY()+130, 130, 95);
            contentPane.add(bottone3);
            JButton bottone4 = null;
            try {
                bottone4 =new JButton("Regular",new ImageIcon(new URL(immagine)));
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bottone4.setBounds(10, bottone3.getY()+130, 130, 95);
            contentPane.add(bottone4);
            y[0]=11;
            y[1]=141;
            y[2]=271;
            y[3]=401;
    
    
            
            JButton avvia = new JButton("Avvia Gara");
            avvia.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                }
            });
            avvia.addMouseListener(new MouseAdapter() {
                auto auto1=new auto(bottone1,y[0]);
                auto auto2=new auto(bottone2,y[1]);
                auto auto3=new auto(bottone3,y[2]);
                auto auto4=new auto(bottone4,y[3]);
                
                @Override
                public void mouseClicked(MouseEvent arg0) {
                    
                    
                    
                }
            });
            avvia.setBounds(318, 533, 146, 69);
            contentPane.add(avvia);
            
        }
        
        
        public class auto extends Thread{
            JButton bottone = new JButton();
            int x=10;
            int nuovax=x;
            int y;
            public auto(JButton bottone,int y) {
                super();
                this.bottone = bottone;
                this.y=y;
    
    
            }
            int distanza=470;
            int spaziopercorso;
            Random ran=new Random();
            public void run(){
                while(distanza>=0){
                    spaziopercorso=ran.nextInt(7);
                    distanza=distanza-spaziopercorso;
                    nuovax=nuovax+spaziopercorso;
                    bottone.setBounds(nuovax, y, bottone.getWidth(), bottone.getHeight());
                    try {
                        this.sleep(5);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                //fine gara
    
    
            }
            void reset(){
                bottone.setBounds(x, bottone.getY(), bottone.getWidth(), bottone.getHeight());
            }
        }
    }
    Grzie a presto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    solo che mi da un errore nel codice e non so come risolverlo
    lerrore e in questa istruzione:
    codice:
    auto auto1=new auto(bottone1,y[0]);
    Le variabili y e bottone1/bottone2/bottone3/bottone4 sono "locali" al costruttore e stai cercando di usarle all'interno di una anonymous inner class dentro il costruttore. Ci sono delle regole. Prima di Java 8 queste variabili DEVONO essere final. Da Java 8 è stato introdotto il concetto di "effectively final" che rende non necessario il final, a patto che il compilatore deduca che la variabile non viene modificata successivamente alla inizializzazione.

    La variabile y non viene modificata successivamente (vengono settati gli elementi dopo, ma non la variabile y in sé), quindi in Java 8 NON è necessario che sia final.
    Il problema sono le variabili dei button. Non sono "effectively final" (perché le assegni dopo la inizializzazione a null) e NON possono essere final (proprio perché c'è l'assegnamento).

    Soluzione: tieni le variabili dei pulsanti come variabili "di istanza", non locali al costruttore.


    P.S. il resto comunque NON è buono. Tanto per dirne una: l'accesso ai componenti e alla interfaccia grafica va fatto (salvo casi particolari e documentati) solo nel contesto del Event Dispatch Thread. Mentre tu stai accedendo e modificando i pulsanti anche dal run() dei thread a parte. Questo è inappropriato. Quindi servono anche le "basi" su questi argomenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Le variabili y e bottone1/bottone2/bottone3/bottone4 sono "locali" al costruttore e stai cercando di usarle all'interno di una anonymous inner class dentro il costruttore. Ci sono delle regole. Prima di Java 8 queste variabili DEVONO essere final. Da Java 8 è stato introdotto il concetto di "effectively final" che rende non necessario il final, a patto che il compilatore deduca che la variabile non viene modificata successivamente alla inizializzazione.

    La variabile y non viene modificata successivamente (vengono settati gli elementi dopo, ma non la variabile y in sé), quindi in Java 8 NON è necessario che sia final.
    Il problema sono le variabili dei button. Non sono "effectively final" (perché le assegni dopo la inizializzazione a null) e NON possono essere final (proprio perché c'è l'assegnamento).

    Soluzione: tieni le variabili dei pulsanti come variabili "di istanza", non locali al costruttore.


    P.S. il resto comunque NON è buono. Tanto per dirne una: l'accesso ai componenti e alla interfaccia grafica va fatto (salvo casi particolari e documentati) solo nel contesto del Event Dispatch Thread. Mentre tu stai accedendo e modificando i pulsanti anche dal run() dei thread a parte. Questo è inappropriato. Quindi servono anche le "basi" su questi argomenti.
    Ciao grazie della risposta, sinceramente non ho capito la soluzione, poi per quanto riguardale mie basi non posso farci molto ho solo fatto ciò che mi è stato richiesto dal mio professore,e sono d'accordo che non sono il massimo; potresti spiegarmi in un modo differente ho cambiare le porzione di codice se hai voglia ?
    ciao,
    grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    sinceramente non ho capito la soluzione
    private JPanel contentPane;

    è una variabile "di istanza". Metti bottone1....bottone4 allo stesso modo.


    P.S. conosci la differenza tra variabili locali, di istanza, di classe ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    avevo già provato a mettere le variabili di istanza ma il problema rimane
    ps: si + o -
    Quote Originariamente inviata da andbin Visualizza il messaggio
    private JPanel contentPane;

    è una variabile "di istanza". Metti bottone1....bottone4 allo stesso modo.


    P.S. conosci la differenza tra variabili locali, di istanza, di classe ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    avevo già provato a mettere le variabili di istanza ma il problema rimane
    Rimane cosa, come? Se metti le 4 variabili dei pulsanti come variabili "di istanza", il tuo codice perlomeno compila sicuramente. Poi se ci sia dell'altro che non ho osservato bene io, non so.

    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    ps: si + o -
    Se ti metti a fare interfacce grafiche con multi-threading, il "più o meno" su questi concetti non ci dovrebbe essere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    questo e il codice con le modifiche da te suggerite:
    codice:
    package gara;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Random;
    
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JButton;
    import javax.swing.ImageIcon;
    import java.awt.Color;
    import javax.swing.SwingConstants;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class gara extends JFrame {
    
    
    	private JPanel contentPane;
    	private JButton bottone1;
    	private JButton bottone2;
    	private JButton bottone3;
    	private JButton bottone4;
    
    
    
    
    
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					gara frame = new gara();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    		
    	}
    
    
    	/**
    	 * Create the frame.
    	 */
    	public gara() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 866, 652);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		contentPane.setLayout(null);
    		setContentPane(contentPane);
    		String immagine="http://images.clipartpanda.com/car-top-view-clipart-red-racing-car-top-view-fe3a.png";
    		int y[]=new int[4];
    		JButton bottone1 = null;
    		try {
    			bottone1 =new JButton("Regular",new ImageIcon(new URL(immagine)));
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		bottone1.setBounds(10, 11, 130, 95);
    		contentPane.add(bottone1);
    		
    		JButton bottone2 = null;
    		try {
    			bottone2 =new JButton("Regular",new ImageIcon(new URL(immagine)));
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		bottone2.setBounds(10, bottone1.getY()+130, 130, 95);
    		contentPane.add(bottone2);
    		JButton bottone3 = null;
    		try {
    			bottone3 =new JButton("Regular",new ImageIcon(new URL(immagine)));
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		bottone3.setBounds(10, bottone2.getY()+130, 130, 95);
    		contentPane.add(bottone3);
    		JButton bottone4 = null;
    		try {
    			bottone4 =new JButton("Regular",new ImageIcon(new URL(immagine)));
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		bottone4.setBounds(10, bottone3.getY()+130, 130, 95);
    		contentPane.add(bottone4);
    		y[0]=11;
    		y[1]=141;
    		y[2]=271;
    		y[3]=401;
    
    
    		
    		JButton avvia = new JButton("Avvia Gara");
    		avvia.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    			}
    		});
    		avvia.addMouseListener(new MouseAdapter() {
    			auto auto1=new auto(bottone1,y[0]);
    			auto auto2=new auto(bottone2,y[1]);
    			auto auto3=new auto(bottone3,y[2]);
    			auto auto4=new auto(bottone4,y[3]);
    			
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				
    				
    				
    			}
    		});
    		avvia.setBounds(318, 533, 146, 69);
    		contentPane.add(avvia);
    		
    	}
    	
    	
    	public class auto extends Thread{
    		JButton bottone = new JButton();
    		int x=10;
    		int nuovax=x;
    		int y;
    		public auto(JButton bottone,int y) {
    			super();
    			this.bottone = bottone;
    			this.y=y;
    
    
    		}
    		int distanza=470;
    		int spaziopercorso;
    		Random ran=new Random();
    		public void run(){
    			while(distanza>=0){
    				spaziopercorso=ran.nextInt(7);
    				distanza=distanza-spaziopercorso;
    				nuovax=nuovax+spaziopercorso;
    				bottone.setBounds(nuovax, y, bottone.getWidth(), bottone.getHeight());
    				try {
    					this.sleep(5);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    			//fine gara
    
    
    		}
    		void reset(){
    			bottone.setBounds(x, bottone.getY(), bottone.getWidth(), bottone.getHeight());
    		}
    	}
    }
    Mi rimane questo errore

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Rimane cosa, come? Se metti le 4 variabili dei pulsanti come variabili "di istanza", il tuo codice perlomeno compila sicuramente. Poi se ci sia dell'altro che non ho osservato bene io, non so.


    Se ti metti a fare interfacce grafiche con multi-threading, il "più o meno" su questi concetti non ci dovrebbe essere.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    questo e il codice con le modifiche da te suggerite:
    codice:
    public class gara extends JFrame {
    	private JPanel contentPane;
    	private JButton bottone1;
    	private JButton bottone2;
    	private JButton bottone3;
    	private JButton bottone4;
    Sì, queste sono variabili "di istanza".


    Ma ..... hai tenuto le variabili locali:


    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    codice:
    		JButton bottone1 = null;
    ....
    		JButton bottone2 = null;
    ....
    E queste variabili locali "nascondono" (tecnicamente si chiama shadowing) le variabili di istanza poiché hanno lo stesso nome.


    "shadowing", altro concetto DA SAPERE.
    Ultima modifica di andbin; 13-04-2017 a 18:26
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Ok grazie ho capito, ho imparato anche cose nuove : )
    Sai come posso far ripartire i thread ripremendo lo stesso bottone? ho provato .stop ma non e piu utilizzato System.gc
    interrupt .... ma a quanto pare sembra non sia piu possibile rimandare in esecuzione un thread, quasi come una volta finito il codice rimane passivo nella memoria ? Magari non sono normale io XD
    Perlomeno con .reset rimette i JButton all'inizio

  10. #10
    Quote Originariamente inviata da frakkio11299 Visualizza il messaggio
    Ok grazie ho capito, ho imparato anche cose nuove : )
    Sai come posso far ripartire i thread ripremendo lo stesso bottone? ho provato .stop ma non e piu utilizzato System.gc
    interrupt .... ma a quanto pare sembra non sia piu possibile rimandare in esecuzione un thread, quasi come una volta finito il codice rimane passivo nella memoria ? Magari non sono normale io XD
    Perlomeno con .reset rimette i JButton all'inizio
    ho fatto un array di oggetti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.