Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Combobox+listener

  1. #1

    Combobox+listener

    Salve, sto svolgendo una traccia d'esame e quindi vi metterò soltanto il punto che non riesco a svolgere.
    Traccia:
    Implementare una classe starter che:
    a.
    Crea un oggetto Squadra con 20 tesserati scegliendo:
    12 giocatori e il resto a caso tra tecnici e dirigenti.
    b.
    Visualizza in un frame:
    1)
    Una label con il bilancio corrente della squadra;
    2)
    Una combo box con la lista dei 20 tesserati
    inseriti (visualizzare nella lista la stringa [Cognome,Ruolo oppure Specializzazione oppure Competenza]);
    3)
    Un bottone che calcola lo stipendio del tesserato selezionato e visualizza il risultato con una label;
    4)
    Un bottone che effettua il pagamento degli stipendi e aggiorna la label che visualizza il bilancio corrente.
    Al momento ho creato una classe tester così:
    codice:
    public class tester 
    {
        
        public static void main(String[] args) 
        {
            Squadra cesena= new Squadra();
            Calciatore a= new Calciatore(200.0, "difensore");
            Calciatore b= new Calciatore(1500.0, "centrocampista");
            Calciatore c= new Calciatore(20.0, "attaccante");
            Calciatore d= new Calciatore(100.0, "difensore");
            Calciatore e= new Calciatore(150.0, "attaccante");
            Calciatore f= new Calciatore(50.0, "difensore");
            Calciatore g= new Calciatore(15.0, "centrocampista");
            Calciatore h= new Calciatore(30.0, "portiere");
            Calciatore i= new Calciatore(70.0, "portiere");
            Calciatore l= new Calciatore(60.0, "difensore");
            Calciatore m= new Calciatore(90.0, "attaccante");
            Calciatore n= new Calciatore(60.0, "attaccante");
            Tecnico o= new Tecnico("Allenatore");
            Tecnico p= new Tecnico("Massaggiatore");
            Tecnico q= new Tecnico("Magazziniere");
            Dirigente r= new Dirigente("3Posto");
            Dirigente s= new Dirigente("2Posto");
            Dirigente t= new Dirigente("3Posto");
            Dirigente u= new Dirigente("1Posto");
            Dirigente v= new Dirigente("2Posto");
            cesena.getTesserati().add(a);
            cesena.getTesserati().add(b);
            cesena.getTesserati().add(c);
            cesena.getTesserati().add(d);
            cesena.getTesserati().add(e);
            cesena.getTesserati().add(f);
            cesena.getTesserati().add(g);
            cesena.getTesserati().add(h);
            cesena.getTesserati().add(i);
            cesena.getTesserati().add(l);
            cesena.getTesserati().add(m);
            cesena.getTesserati().add(n);
            cesena.getTesserati().add(o);
            cesena.getTesserati().add(p);
            cesena.getTesserati().add(q);
            cesena.getTesserati().add(r);
            cesena.getTesserati().add(s);
            cesena.getTesserati().add(t);
            cesena.getTesserati().add(u);
            cesena.getTesserati().add(v);
            cesena.aggiornaStipendi(30);
            cesena.setBilancio(90000.00);
        }
        
    }
    e una classe grafica così:
    codice:
    public class Grafica 
    {
        Squadra c;
        public Grafica(Squadra c)
        {
    
            ClickListenerSeleziona lisel= new ClickListenerSeleziona();
            JFrame frame= new JFrame(); 
            JPanel panel= new JPanel();    
            JLabel label= new JLabel(""+c.getBilancio());
            JLabel label2= new JLabel("Seleziona tesserato di cui vuoi vedere lo stipendio");
            JComboBox<Tesserato> cmb= new JComboBox<Tesserato>();
            for(int ii=0;ii<c.getTesserati().size();ii++)
            {
                cmb.getSelectedIndex();
                cmb.addItem(c.getTesserati().get(ii));
            }
            JButton button= new JButton("Calcola");
            button.addActionListener(lisel);
            panel.add(label);
            panel.add(label2);
            panel.add(cmb);
            panel.add(button);
            frame.add(panel);
        }
            public class ClickListenerSeleziona implements ActionListener
            {
                public void actionPerformed(ActionEvent event)
                {
                    JLabel label3= new JLabel(c.getTesserati().get());
                }
            }
        }
    Non so come far selezionare al clicklistener l'elemento che seleziono nella combobox. Vi ringrazio anticipatamente

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Antonio181926 Visualizza il messaggio
    Non so come far selezionare al clicklistener l'elemento che seleziono nella combobox. Vi ringrazio anticipatamente
    Il punto/problema è che la variabile cmb è "locale" al costruttore. E la inner-class ClickListenerSeleziona non ha alcun appiglio per accederci.

    Si risolve in diversi modi, cambiando un po' il design.

    Banalmente ad esempio mettendo la implementazione di ActionListener come anonymous inner-class nel costruttore:

    codice:
    public Grafica(Squadra c) {
        // .......
        JComboBox<Tesserato> cmb = new JComboBox<Tesserato>();
    
        JButton button = new JButton("Calcola");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                Tesserato tesseratoSelezionato = (Tesserato) cmb.getSelectedItem();
                // .......
            }
        });
    
        // .......
    }

    Se actionPerformed è relativamente breve (poche righe) può andare bene.

    Altrimenti si può cambiare il design maggiormente e più in generale. Il JComboBox ti potrebbe servire in altri punti della classe, oltre al costruttore. Così come gli altri componenti.
    Allora tieni i componenti come variabili di istanza della classe.

    codice:
    public class Grafica {
        private JFrame frame;
        // .....
        private JComboBox<Tesserato> cmb;
    
        public Grafica(Squadra c) {
            frame = new JFrame(); 
            // .....
            cmb = new JComboBox<Tesserato>();
            // .....
        }
    
        private class ClickListenerSeleziona implements ActionListener {
            public void actionPerformed(ActionEvent event) {
                // qui PUOI usare cmb
            }
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Per prendere l'elemento selezionato nel JComboBox puoi usare:

    codice:
    Tesserato tesserato = cmb.getItemAt (cmb.getSelectedIndex ());
    Questo codice ti assicura di avere in tesserato il reference dell'oggetto selezionato, o null se nessun elemento è stato selezionato.
    Esiste anche il metodo getSelectedItem (), che ritorna però un Object, devi quindi fare un cast (che va bene comunque).

    La difficoltà maggiore comunque è rappresentata dal fatto che la tua classe ClickListenerSeleziona non ha il riferimento del JComboBox.
    Potresti anche passarglielo nel costruttore, ma non sarebbe un buon design.

    La soluzione più semplice (e secondo me anche pulita) è aggiungere come ascoltatore del pulsante una classe "anonima", che quindi ha accesso al combobox nel costruttore della classe Grafica:

    codice:
    JComboBox <Tesserato> cmb = new JComboBox <Tesserato> ();
    ...
    JButton button = new JButton ("Calcola");
    button.addActionListener (new ActionListener () {
        public void actionPerformed (ActionEvent event) {
            Tesserato tesserato = cmb.getItemAt (cmb.getSelectedIndex ());
            // ... Fai quello che vuoi con tesserato.
        }
    });
    ...
    L'unica limitazione è che cmb deve essere "effectively final" (cioè non puoi assegnarci un altro oggetto) visto che è usato all'interno di un'inner class (con java <= 7 sei invece costretto a dichiarare cmb come final).

    PS: Ho visto solo ora il messaggio di @andbin. Repetita iuvant
    Ultima modifica di Ansharja; 08-02-2018 a 17:46

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    codice:
    Tesserato tesserato = cmb.getItemAt (cmb.getSelectedIndex ());
    Sì, dal JDK7 (che ha reso JComboBox "generica") meglio questo rispetto al getSelectedItem() perché è più type-safe. Il getSelectedItem() era comodo nelle release precedenti, al solo costo del cast esplicito.


    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    PS: Ho visto solo ora il messaggio di @andbin. Repetita iuvant
    No prob.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    L'ho svolto come dici ma quando vado a fare Grafica c= new Grafica(Squadra i) e avvio non succede nulla, come mai?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Hai creato un JFrame, ci hai messo dentro tante cose e... non lo hai mai reso visibile.
    L'ultima istruzione da eseguire è la visualizzazione della finestra: devi chiamare un setVisible( true ); sul JFrame da visualizzare.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Giusto, scusami avevo dimenticato di mettere il set visible true

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.