Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di gax80
    Registrato dal
    May 2006
    Messaggi
    631

    mettere l'actionEvent in parallelo

    ciao ragazzi
    come sempre ho bisogno del vostro del vostro aiuto...
    ho un pannello su cui sono inseriti dei bottoni e utlizzo actionlistener per renderli "eseguibili", però ho un problema come faccio a distinguere:


    public void actionPerformed(ActionEvent e)


    per ogni bottone perchè so che l'actionevent è univoco nella pagina, sicuramente ci vorrà un if x distinguere i vari tasti..


    grazie
    quando il diavolo ti accarezza è perchè vuole la tua anima

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Hai essenzialmente 2 metodi.

    1) Definisci un ActionListener per ciascun pulsante.
    2) Aggiungi lo stesso ActionListener a tutti i pulsanti e li distingui in qualche modo.

    Il primo non necessita di grosse spiegazioni:
    codice:
    pulsante1.addActionListener( new ActionListener() {
       public void actionPerformed(ActionEvent ae) {
          ... // Fai qualcosa
       }
    });
    
    pulsante2.addActionListener( new ActionListener() {
       public void actionPerformed(ActionEvent ae) {
          ... // Fai qualcosa altro
       }
    });
    ...
    Per il secondo puoi agire, anche qui, in modi diversi. Ad esempio, puoi utilizzare il metodo getLabel() per distinguerli:
    codice:
    public void actionPerformed(ActionEvent ae) {
       JButton jb = (JButton) ae.getSource();
       if ( jb.getLabel().equals("Pulsante 1") ) {
          ... // Fai qualcosa
       }
    
       if ( jb.getLabel().equals("Pulsante 2") ) {
          ... // Fai qualcosa altro
       }
       ...
    }
    Oppure puoi scrivere una classe che estende JButton che preveda un metodo per distinguerli, ad esempio nu intero (così si può usare lo switch() ):
    codice:
    public class Pulsante extends JButton {
       private int idx;
       public Pulsante(String str, int idx) {
          super(str);
          this.idx = idx;
       }
    
       public int getIdx() { return idx; }
    }
    
    ...
    
    Pulsante p1 = new Pulsante("Testo", 0);
    Pulsante p2 = new Pulsante("Testo", 1);
    ...
    
    public void actionPerformed(ActionEvent ae) {
       Pulsante p = (Pulsante) ae.getSource();
    
       switch( p.getIdx() ) {
          case 0:
             ...  // Fai qualcosa
             break;
    
          case 1:
             ...   // Fai qualcos'altro
             break;
       }
    }
    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

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da LeleFT
    Per il secondo puoi agire, anche qui, in modi diversi. Ad esempio, puoi utilizzare il metodo getLabel() per distinguerli:
    codice:
    public void actionPerformed(ActionEvent ae) {
       JButton jb = (JButton) ae.getSource();
       if ( jb.getLabel().equals("Pulsante 1") ) {
          ... // Fai qualcosa
       }
    
       if ( jb.getLabel().equals("Pulsante 2") ) {
          ... // Fai qualcosa altro
       }
       ...
    }
    Soluzione certamente fattibile ma ... scomoda e noiosa. E se uno vuole cambiare il nome al pulsante?? Deve "ricordarsi" di cambiarlo sia nel punto della creazione che nell'actionPerformed. E se il testo del pulsante fosse stato generato dinamicamente o comunque non noto a priori, "localizzato" o altro??

    Meglio, secondo me, fare un banale test sui reference dei JButton:

    codice:
    private JButton button1;
    private JButton button2;
    ...
    
    public void actionPerformed(ActionEvent ae) {
        Object objSrc = ae.getSource();
    
        if (objSrc == button1) {
            ....
        } else if (objSrc == button2) {
            ....
        }
    }
    Originariamente inviato da LeleFT
    Oppure puoi scrivere una classe che estende JButton che preveda un metodo per distinguerli, ad esempio nu intero (così si può usare lo switch() ):
    Soluzione interessante. Però bisogna valutare se vale la pena oppure no. Se i pulsanti sono pochi la eviterei (a favore del test dei reference). Sarebbe invece utile in caso di molti pulsanti o se i pulsanti devono avere delle "proprietà" aggiuntive particolari.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io mi sono semplicemente limitato ad esporre le possibilità. Ognuno sceglie la strada che più gli si addice.
    Se vogliamo essere pignoli, nemmeno il test dei references è sicuro: se l'applicazione fa e disfa pulsanti al volo i references possono puntare a nulla in qualsiasi momento.
    Per non parlare del fatto che l'applicazione potrebbe creare pulsanti, senza nemmeno affidarsi ad un reference.
    codice:
    pannello.add( new JButton("MioPulsante") );
    
    ...
    
    Component [] c = pannello.getComponents();
    
    for(int i=0; i<c.length; i++) {
       if (c[i] instanceof JButton) {
          c[i].addActionListener( mioListener );
       }
    }
    Fattibilissimo.
    Ma fin dove regge? Mah...
    Se questa è una versione fattibile del programma, allora ben venga l'utilizzo di una classe ad hoc che estende JButton, che nel costruttore prende anche l'ActionListener da assegnare al pulsante (una delle tante varianti che ho usato nella mia carriera)... ci si risparmia un sacco di problemi.
    codice:
    pannello.add( new Pulsante("Testo", indice, actionListener) );
    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

  5. #5
    Utente di HTML.it L'avatar di gax80
    Registrato dal
    May 2006
    Messaggi
    631
    ciao vi ringrazio dell'aiuto, ma il problema è ben più complesso, cioè in base al bottone che premo, mi richiama una classe che in base al tasto che ho premuto, mi fa una cosa anzichè un'altra.
    La domanda è come faccio a digli alla classe quale tasto ho premuto, ho visto che il

    Codice PHP:
    b.setActionCommand("enable");
    b.setEnabled(true); 
    nn lo trova nell'altra classe....
    facendo
    Codice PHP:
    "enable." 
    non mi trova il componente...
    come faccio???
    quando il diavolo ti accarezza è perchè vuole la tua anima

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io non ci ho capito niente...
    Prova a riformulare la domanda e, magari, a postare anche un po' di codice.

    Credo che tu la stia facendo più difficile di quello che in realtà è. Non è un problema distinguere il pulsante premuto (e questo è stato ampiamente discusso prima), quindi ogni altro problema derivante da questo non è in realtà un problema.


    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
    Utente di HTML.it L'avatar di gax80
    Registrato dal
    May 2006
    Messaggi
    631
    io sto usando anche due RadioButton di uno stesso gruppo e in base al radiobutton selezionato e il tasto x andare avanti mi dovrebbe aprire un particolare frame, questo è il codice:

    [JAVA]
    JButton first = new JButton("avanti");
    JRadioButton radio1 = new JRadioButton("singolo file");
    JRadioButton radio2 = new JRadioButton("tutta la cartella");
    ButtonGroup group = new ButtonGroup();
    group.add(radio1);
    group.add(radio2);
    first.setActionCommand("pigiato");


    if ("pigiato".equals(e.getActionCommand()) && (radio1.isSelected()) {

    [/JAVA]
    il problema è la riga in rosso, non mi vede il radio1 selezionato, come faccio?

    grazie :master: :master: :master: :master:
    quando il diavolo ti accarezza è perchè vuole la tua anima

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gax80
    il problema è la riga in rosso, non mi vede il radio1 selezionato, come faccio?
    In genere è preferibile (e buona cosa) tenere i riferimenti ai vari componenti come variabili di istanza, non variabili locali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di gax80
    Registrato dal
    May 2006
    Messaggi
    631
    cioè che vuol dire? nn devo usare il SetActionCommand?
    quando il diavolo ti accarezza è perchè vuole la tua anima

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gax80
    cioè che vuol dire? nn devo usare il SetActionCommand?
    No ... quel codice che hai messo in rosso, suppongo che l'hai messo in un metodo di un listener o qualcosa del genere. L'altro codice suppongo che l'hai messo nel costruttore o in un altro metodo.
    Ovvio che se le variabili radio1/radio2 le dichiari come locali, non le vedi da altri metodi!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava 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 © 2025 vBulletin Solutions, Inc. All rights reserved.