Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    39

    Cast da Components a una classe che estende JButton

    Ciao ragazzi ho un problema. Ho creato una classe carta che estende jbutton se faccio:
    Component[ ] c=pannello.getComponents();
    for (int i=0;i<c.lenght;i++){
    Carta v=(Carta)c[i];
    In fase di esecuzione mi dice che non puo fare un cast a Carta, se nel for faccio
    if(c[i] instanceof Carta)
    Non mi daerrorre ma non mi fa accedere a lle carte.
    Dove sbaglio?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da breathex Visualizza il messaggio
    Ciao ragazzi ho un problema. Ho creato una classe carta che estende jbutton se faccio:
    Component[ ] c=pannello.getComponents();
    for (int i=0;i<c.lenght;i++){
    Carta v=(Carta)c[i];
    In fase di esecuzione mi dice che non puo fare un cast a Carta, se nel for faccio
    if(c[i] instanceof Carta)
    Non mi daerrorre ma non mi fa accedere a lle carte.
    Dove sbaglio?
    Purtroppo non hai postato molto altro ... quindi non si può sapere se c'è dell'altro oppure no.

    Comunque: se Carta estende JButton, allora Carta è-un Component. Quindi un cast da Component a Carta è lecito per il compilatore.
    Poi se a runtime il cast ha successo oppure no, dipende ovviamente dall'oggetto realmente presente. Se è davvero un oggetto Carta, allora il cast ha successo, altrimenti no (ClassCastException).

    Visto che il getComponents() ti dà tutti i componenti nel pannello, allora:
    - se sei sicuro che gli unici componenti contenuti sono solo oggetti Carta, allora puoi fare il cast diretto a Carta (senza alcun test prima) perché ragionevolmente è ovvio che il cast non fallirà.
    - se non sicuro che gli unici componenti contenuti sono solo oggetti Carta oppure se sai già a priori che ci sono anche altri componenti non Carta, allora dovresti prima fare un test con instanceof e poi solo se ha successo allora fai un cast a Carta.


    E comunque, per dirla tutta, il tuo approccio non è per niente "pulito". Intendo il fatto di andare a "scoprire" cosa c'è dentro i contenitori. Sarebbe stato molto meglio tenere a parte un array ( Carta[] ) o lista ( List<Carta> ) di oggetti Carta in modo da non dover fare quello che stai facendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    39
    ecco il codice
    codice:
    public class Sequenza3 extends JFrame{
       
       static int posizionev;
        static Pannello2 p;
        public static boolean primavolta=true;
        JButton sposta=null;
        JButton start=null;
        public  Mazzo m;
        Carta d;
        ImageIcon ic;
        static boolean inProgress=false;
        LinkedList<Carta>carteMazzo;
        static int contatore;
        public Sequenza3(){
             super("Sequenza Foto");
             
             
              m=new Mazzo();
             p= new Pannello2();
             p.setLayout(null);
             setContentPane(p);
    
    
             contatore=0;
            carteMazzo=new LinkedList<Carta>();
             LinkedList<Carta>l=new LinkedList<Carta>();
             l.addAll(m.getCarte());
            d=null;
            Iterator<Carta>it1=l.iterator();
            
            
            while(it1.hasNext()){
                d=it1.next();
                ImageIcon ij=new ImageIcon(d.getFacciata());
                d.setIcon(ij);
                 
                
                  d.setBorderPainted(false);
                  d.setBounds(20, 200, 120, 125);
                  d.setclickabile(false);
                  d.setContentAreaFilled(false);
                  d.setEnabled(true);
                  
                  d.setVisible(true);
                p.add(d);
                carteMazzo.add(d);
                m.rigeneraMazzo(carteMazzo);
            }
       
             start=new JButton("start");
             start.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent arg0) {
                    if(primavolta){
                        start(6);
                    }
                    else start(2) ;
                    
                }
             });
             start.setBounds(100,600,100,50);
             
             p.add(start);
             sposta=new JButton("sposta");
             sposta.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent arg0) {
                    sposta();
                    
                }
             });
             sposta.setBounds(200,600,100,50);
             
             p.add(sposta);
             setSize(950,700);
             setLocation(200,40);
             setVisible(true); 
             //repaint();
        }
    
    
        public static void start(int n){
            if(inProgress)
                return;
            inProgress=true;
            
            primavolta=false;
            Thread runner=new Thread() { 
            public void run(){
                
                 for (int j=0;j<n;j++){
                    
                     Carta f=(Carta)p.getComponent(contatore);
                     
                    contatore++;
                     int i=0;
                     
                    p.reset(20,170);
                    
                     while (i<40){//i è il passo del thread
                                ImageIcon imc=new ImageIcon( f.getFacciata()); 
                            p.paintbutton(f,imc);   
                                 i++;
                        try {
                           sleep(50);
                       } catch (Exception ex) {}
                   } 
                    
                 
                     inProgress=false;
                 
                 }
             }  
           };
           runner.start();//deve lasciare libero il thread che richiama paint...
           
        }
        public  void sposta(){
        
            
                              Component[] d=p.getComponents();
                              for(int i=0;i<d.length;i++){
                                 if(d[i] instanceof Carta){
                        
                                  Carta f=(Carta)d[i];
                                 if(f.getposizione()==8){
                            
                                        Point po=f.getLocation();
                                           int x=(int)po.getX();
                                           int y=(int)po.getY();    
                               
                                            System.out.println(x+"  "+y);
    
    
                                              int j=0;
                                           p.reset(x,y);
                               
                                          while (j<30){ j è i passo del thread  che posizionera la carta al centro del pannello
                                   
                                             ImageIcon imc=new ImageIcon( f.getFacciata()); 
                                            p.paintcarta(f,f.getposizione(),j);
                               
                                            j++;
                                 
                                    } 
                               
                                  
                                }  
                            }
                          }
                            
                            
                        
    
    
        }
        public static int getposizionivuote(){
            return posizionev;
        }
        public static void setposizionevuota(int pos){
            posizionev =pos;
        }
        public int getContatore(){
            return contatore;
        }
        public static void moveCarta(Carta v){
            if(inProgress)
                return;
            inProgress=true;
            
            
            Thread runner=new Thread() { 
            public void run(){
                 
                Point po=v.getLocation();
                 int x=(int)po.getX();
                 int y=(int)po.getY();    
                    
                    
                     int i=0;
                      p.reset(x,y);
                    
                     while (i<30){
                        
                           ImageIcon imc=new ImageIcon( v.getFacciata()); 
                            p.paintcarta(v,v.getposizione(),i);
                    
                               i++;
                        try {
                           sleep(50);
                       } catch (Exception ex) {}
                   } 
                    
                     inProgress=false;
                 
                 
             }  
           };
           runner.start();//deve lasciare libero il thread che richiama paint...
           
        }
        public static void main(String[] args) {
            Sequenza3 s = new Sequenza3();
            s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
        }
    }
    nel metodo sposta invocato quando si preme il tasto sposta vado a cercare la carta che che si e spostata in posizione 8 cioè al centro del pannello però non accede proprio a quelle carte ,infatti nel system.out non stampa niente, non capisco perchè.
    Andbin cmq ho provato come consigliavi tu ma una volta aggiunto le carte nel pannello nel costruttore perdo quel riferimento alla carta nel mazzo. nel metodo start Il programma distribuiva le sei carte ma restava visibile la prima carta del mazzo quindi in realta non spostava le carte dal pannello ma creava un altro mazzo e spostava le carte di del <Carta>mazzocarte.
    Epoi non capisco perche se un bottone si sovrappone ad unn altro bottone si vede la prima carta e non quella sovrapposta.esiste un modo per fare vedere l'ultimo bottone ?
    Ultima modifica di breathex; 24-05-2017 a 12:18

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Ci sono talmente tante cose che non vanno nel codice che ... sono ... imbarazzato a rispondere ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.