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

Discussione: [JAVA]loop e bottoni

  1. #1

    [JAVA]loop e bottoni

    Ciao a tutti io ho questo code :

    Classe characters:

    codice:
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Characters extends Thread {
       private int x;
       private int y;
       private JPanel frame;
       private Image im;
       public Characters(int a,int b) {
          x = a;
          y = b;
       }
       
       public Characters(int i, int j, JPanel frame,String path) {
          this(i,j);
          this.frame = frame;
          im = Toolkit.getDefaultToolkit().getImage (path);
       }
    
       @Override
       public void run() {
     for (int i = 0; i < 22; i = i + 1) {
           
              y += i;
              
             try {
                Thread.sleep(200);
                
             } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                System.out.println(i);
             }
          }
       
       }
    
       public void draw(Graphics graphics){
          graphics.setColor(Color.red);
          
          //qui metti l imagel
          //graphics.drawImage(.....)
          graphics.drawImage(im, x, y,frame);
       }
       
    }
    Classe Main:

    codice:
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.util.LinkedList;
    
    import javax.swing.JFrame;
    
    
    public class Main {
    
       private JFrame frame;
       private static final String[] paths = {"/Users/federicobarassi/NetBeansProjects/OK/src/ok/java1.gif",
          "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java2.gif",
    "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java3.gif",
    "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java4.gif"};
       
       public Main() {
          frame =  new JFrame("Piove");
          frame.setSize(new Dimension(300,300));
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLayout(new BorderLayout());
          frame.getContentPane().add(getFilledCPanel(),BorderLayout.CENTER);
          
          frame.setVisible(true);
       }
       
       private Component getFilledCPanel() {
          CustomPanel panel = null;
          LinkedList<Characters> list = new LinkedList<Characters>();
          for (int i = 0; i < paths.length; i++) {
             list.add(new Characters((i*80),0,panel,paths[i]));
          }
          panel = new CustomPanel(list);
          for (Characters characters : list) {
             characters.start();
          }
          return panel;
       }
    
       public static void main(String[] args) {
          new Main();
       }
    }
    Classe CustomPanel:


    codice:
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.util.LinkedList;
    
    import javax.swing.JPanel;
    
    public class CustomPanel extends JPanel {
       
       private LinkedList<Characters> list;
       
       public CustomPanel() {
          setSize(new Dimension(300,300));
          setBackground(Color.white);
       }
    
       public CustomPanel(LinkedList<Characters> a){
          this();
          list = a;
        
       }
    
        
          @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          for (Characters c : list) {
             c.draw(g);
          }
          repaint();
       }
    }
    Tenendo conto che sono abbastanza ignorante in materia ; vorrei mandare l'azione che fa andare dall'alto verso il basso le immagini(e non viceversa) in loop infinito. Poi non riesco ad aggiungere un bottone che da il play al tutto. Qualcuno riuscirebbe a darmi una mano??
    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]loop e bottoni

    Originariamente inviato da esploratore8
    vorrei mandare l'azione che fa andare dall'alto verso il basso le immagini(e non viceversa) in loop infinito.
    Non vorrei sembrare noioso o pedante ... ma lo avevo spiegato qui

    Originariamente inviato da esploratore8
    Poi non riesco ad aggiungere un bottone che da il play al tutto.
    Per avviare i thread hai fatto:

    codice:
          for (Characters characters : list) {
             characters.start();
          }
    Invece di farlo subito dopo la creazione, lo farai a seguito della pressione sul pulsante. Ovviamente devi poterlo fare solo 1 volta. Quindi dovresti disabilitare il pulsante una volta "usato" o cose del genere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Scusa potresti usare un linguaggio meno tecnico questo codice non l'ho realizzato da solo sono un apprendista certe cosa ancora non le so.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da esploratore8
    Scusa potresti usare un linguaggio meno tecnico questo codice non l'ho realizzato da solo sono un apprendista certe cosa ancora non le so.
    Capisco ... ma un minimo di "tecnicismo" ci vuole ... dopotutto siamo in una sezione sulla programmazione Java ... non sui programmi televisivi.

    A parte le questioni di cui hai chiesto, ci sono altre questioni riguardo il tuo codice che bisognerebbe chiarire e affrontare. Non ne ho parlato prima perché sono questioni che riguardano sia il "design" delle tue classi, sia argomenti più avanzati sui thread e la "concorrenza".

    Una cosa che salta subito all'occhio è che hai invocato un repaint() dentro il paintComponent(). Bene, già questa è una pessima cosa che non si dovrebbe fare!!

    E se invece arriviamo alle questioni sui thread: in Characters il run() viene eseguito in un thread a sé stante. In questo run si usa e si aggiorna la variabile y. Tale variabile viene usata anche dal draw(), che viene eseguito nel contesto di un altro thread (il EDT, event dispatch thread ... quello dedicato alla interfaccia utente). Nel mondo "ideale" aggiornando una variabile condivisa da un thread X, il nuovo valore viene visto subito dopo sempre correttamente da un altro thread Y. Nel mondo reale no ... ci sono questioni delicate di sincronizzazione. Quella variabile 'y' bisognerebbe dichiararla 'volatile' (che nel tuo caso sarebbe sufficiente) oppure usare una apposita sincronizzazione.

    Insomma ... bisognerebbe ripensare un po' bene il tutto. Capisco che per te non sia facile ... ma è così.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quindi??? come dovrei fare... cosi non mi aiuti!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da esploratore8
    Quindi??? come dovrei fare...
    Ok, vediamo di fare qualche altra ipotesi per una soluzione migliore. Cercherò di spiegarlo a parole e in modo meno tecnico possibile.

    Innanzitutto fino ad adesso Characters è un Thread con un proprio run() in cui fai "avanzare" lo stato della animazione, in pratica incrementi la Y ogni tot di tempo. Hai più oggetti Characters e ne consegue altrettanti thread.

    Proviamo a spostare il thread e a farne 1 solo! Il thread potrebbe essere gestito in CustomPanel e il suo run() dovrebbe ripetere in sequenza infinita (come chiedevi) le seguenti cose:

    1) attesa di un tot di tempo
    2) "avanzamento" dei vari Characters
    3) repaint
    quindi si riparte da 1)

    per "avanzamento" dei vari Characters intendo una cosa molto semplice. In Characters non c'è più un thread ma un semplice metodo es. avanza() in cui tu esegui le operazioni necessarie affinché il Characters passi ad uno stato successivo, il che nel tuo caso vuol poi dire che si incrementa con una qualche logica quella Y.
    Characters non deve fare molto altro, quel draw() va bene e serve appunto per disegnare la entità da rappresentare.
    Per dirla in modo semplice, Characters offre 2 operazioni (come minimo): "avanza" e "disegnati". Tutto qua.

    Come ho detto sopra, CustomPanel gestisce un solo thread, il repaint() non lo devi più fare in paintComponent() (che come ho già detto non è una bella cosa) ma durante la esecuzione del thread. Il resto di paintComponent() va bene, ovvero invocazione del super di paintComponent() e disegno dei vari oggetti nella lista.

    Rimane ancora la questione della concorrenza: l'avanzamento lo fai nel contesto di un thread a parte mentre il draw viene fatto nel contesto del EDT (il paintComponent() viene invocato da Swing ... non da te direttamente!). Ma si può risolvere.

    Come vedi abbiamo "girato" un pochino le cose. Come ti sembra? Più semplice o più difficile? Prova a pensarci e magari a modificare il codice. Se hai dubbi, ovviamente chiedi pure.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ciao grazie per le dritte... Mi hanno passato il code per il jbutton ma le mie immagini compaiono prima del click sul bottone ed essendo gif animate con un tempo prestabilito in modo che quando arrivano al margine basso del display esplodono non va bene. Si potrebbe farle comparire solo al momento del click ?? Quindi quando si schiaccia lo start compaiono le gif e parte il movimento.

    il code è questo
    Classe Main:

    codice:
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.LinkedList;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    public class Main implements ActionListener{
    
       private JFrame frame;
       private LinkedList<Characters> list;
       private boolean isStart = false;
       
       private static final String[] paths = {"/Users/federicobarassi/NetBeansProjects/OK/src/ok/java1.gif",
          "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java2.gif",
    "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java3.gif",
    "/Users/federicobarassi/NetBeansProjects/OK/src/ok/java4.gif"};
       
       public Main() {
          frame =  new JFrame("Piove");
          frame.setSize(new Dimension(300,300));
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLayout(new BorderLayout());
          frame.getContentPane().add(getFilledCPanel(),BorderLayout.CENTER);
          JButton button = new JButton("start");
          button.addActionListener(this);
          JPanel panel = new JPanel();
          panel.setLayout(new BorderLayout());
          panel.add(button,BorderLayout.CENTER);
          panel.add(new JLabel("-------->"),BorderLayout.WEST);
          panel.add(new JLabel("<--------"),BorderLayout.EAST);
          frame.getContentPane().add(panel,BorderLayout.SOUTH);
          
          frame.setVisible(true);
       }
       
       private Component getFilledCPanel() {
          CustomPanel panel = null;
          list = new LinkedList<Characters>();
          
          for (int i = 0; i < paths.length; i++) {
             list.add(new Characters((i*40),0,panel,paths[i]));
          }
          panel = new CustomPanel(list);
    
          return panel;
       }
    
       public static void main(String[] args) {
          new Main();
       }
    
       public void actionPerformed(ActionEvent e) {
          if(!isStart)
             for (Characters characters : list) {
                characters.start();
             }
          isStart = true;
       }
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    3
    Ciao sono nuovo da queste parti cmq si puo fare in un modo molto svelto ma molto brutto...

    Devi riscrivere lo start() del thread.

    cosi

    public sync.. void start(){
    super.start();
    attivo = true;
    }

    e nel draw

    public void draw(Graphics graphics){
    if(attivo){
    graphics.setColor(Color.red);

    //qui metti l imagel
    //graphics.drawImage(.....)
    graphics.drawImage(im, x, y,frame);
    }
    }

    l assegnazione dell bool in java penso sia atomica spero se no metti volatile come modifier.

    ciaop

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da esploratore8
    codice:
       public void actionPerformed(ActionEvent e) {
          if(!isStart)
             for (Characters characters : list) {
                characters.start();
             }
          isStart = true;
       }
    Non hai applicato le modifiche che suggerivo io, vero? Perché cosi hai ancora che un Characters è un Thread.

    Comunque se mettevi il thread in CustomPanel, veniva semplice anche in questo senso: nel paintComponent() se il thread è alive (isAlive()) allora fai il draw dei Characters.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Scusa ma con questo code è impossibile fare quello che di ho detto?? perchè sia io che il mio amico che mi aiuta con java non ci riusciamo non riusciresti a modificare tu il code in modo che faccia quello che ti ho detto prima??? ti prego poi se avrai bisogno una mano con dei programmi di editing video e audio o di grafica animata non devi fare altro che chiedere a me con questi software sono ferrato: ( logic pro; reason ;pro tools ;after effect;final cut; flash player

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.