Newsgroup: it.comp.java
Titolo: problemi stupidi JButton e actionPerformed

ciao a tutti
ho due problemi stupidi con gli argomenti in oggetto, che ho risolto in un 
modo che IMHO non e' assolutamente la soluzione migliore (e' solo una pezza, 
in attesa di delucidazioni)
il primo e' il seguente:
ho una classe Pulsante che estende JButton con delle informazioni e metodi 
che mi servono all'interno della mia applicazione.. mi serviva un JButton 
che contenesse infatti altre informazioni (legate a dei dati che vengono 
richiamati a seconda del pulsante che si schiaccia) e che potesse scrivere 
testo dinamico multilinea (grazie ai vari <html><br>).. ho quindi ridefinito 
paint() pensando sia l'unico modo possibile.. e' vero?
o c'e' una soluzione infinitamente piu' stupida che mi sfugge? tenete conto 
che ogni pulsante puo' contenere sia scritte tipo "ciao" che "oggi non ho 
nulla da fare".. insomma, da poche lettere a diverse parole.. cosi' funziona 
egregiamente, ma magari mi sono complicato la vita per nulla..
il secondo problema e' invece legato all'utilizzo di questi pulsanti.. una 
piccola parte di questi vengono aggiunti ad una buttonbar (buttonBarSx)..
sotto la buttonbar c'e' un container (buttonPaneContainer) con vari pannelli 
pieni di pulsanti, impostati all'interno del container con un cardlayout..
alla pressione di uno dei pulsanti della buttonbar, si scambiano i pannelli 
sottostanti
i pulsanti vengono generati con un ciclo e infilati dentro un array di tipo 
Pulsante[] pulsanteToggle = new Pulsante[6]..
ora, ogni pulsanteToggle[i] avra' all'interno un actionPerformed, per poter 
dire al pulsante cosa fare quando viene schiacciato..
in particolare il pulsante viene settato inattivo (in questo modo siamo 
"dentro" la pagina fissata dal pulsante), viene riattivato il pulsante 
precedente, viene scambiata la card attuale con la card relativa al pulsante 
e altre cosette varie..
e qui la domanda: l'actionPerformed l'ho dovuta scrivere aggiungendo ad ogni 
pulsante il setter/getter whoAmI, che contiene l'indice nell'array 
pulsanteToggle[i].. tutto questo perche' dentro actionPerformed ovviamente 
io non posso accedere all'indice "i".. ma c'e' un modo piu' intelligente per 
fare questa cosa?
mi sembra alquanto stupido non poter passare all'actionPerformed in qualche 
modo il valore dell'indice i, che mi serve per richiamare la card relativa 
al pulsante pulsanteToggle[i]..
ecco l'actionPerformed preceduta dal whoAmI sul pulsante
    pulsanteToggle[i].setWhoAmI(i);
    pulsanteToggle[i].addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
          int i = ((Pulsante) e.getSource()).getWhoAmI();
          pulsanteToggleSelected.setEnabled(true);
          ((Pulsante) e.getSource()).setEnabled(false);
          pulsanteToggleSelected = ((Pulsante) e.getSource());
          CardLayout cardLayout = (CardLayout) 
getButtonPaneContainer().getLayout();
          cardLayout.show(getButtonPaneContainer(), "buttonPane " + i);
      }
     });
spero di essere stato chiaro, grazie a tutti :) 


riguardo al 1mo problema non so' cosa consigliarti... se ti fai tutto tu 
  "per bene" il codice dovrebbe essere + veloce, altrimenti potresti 
utilizzare un componente che digerisce codice html all'interno del tuo 
pulsante, e nel paint gestisci il disegno del componente utilizzando sia 
  il paint del jbutton, sia il paint dell'altro componente.
per il secondo... ti ricordo che quello che hai scritto per 
addActionListener è la forma abbreviata di una nuova classe(che viene 
generata a compile-time), quindi puoi crearla esplicitamente definendoti 
il costruttore:
class MyAction implements ActionListener {
   private int index;
   public MyAction(int i) {index = i;}
   public void actionPerformed(ActionEvent e) {
     ...
   }
}
pero' in questo modo, con tanti bottoni ti crei tanti oggetti! allora 
perchè non usi solo 1 oggetto ActionListener? e nel tuo ActionListener 
actionPerformed(..) usi:
MyButton myButton = (MyButton) e.getSource();
int index = myButton.getWhoAmI()
Mauro

 int index = myButton.getWhoAmI()
mi sembra sia la stessa cosa che ho fatto io no?
pero' a pensarci bene ora ho fatto cosi'.. la mia classe principale che 
contiene tutta sta roba la dichiaro implementando anche ActionListener, 
cioe'
public class Cassa extends JFrame implements ActionListener { ... }
quando mi serve creo per i pulsanti l'actionListener
pulsanteToggle[i].addActionListener(this);
e poi ho creato il metodo
 public void actionPerformed(ActionEvent e) {
     int i = ((Pulsante) e.getSource()).getWhoAmI();
     pulsanteToggleSelected.setEnabled(true);
     ((Pulsante) e.getSource()).setEnabled(false);
     pulsanteToggleSelected = ((Pulsante) e.getSource());
     CardLayout cardLayout = (CardLayout) 
getButtonPaneContainer().getLayout();
     cardLayout.show(getButtonPaneContainer(), "buttonPane " + i);
 }
non so se e' la soluzione migliore, cosi' funziona, poi potrei usare questo 
trucco anche per tutti gli altri pulsanti, dividendo e selezionando le 
diverse azioni a seconda dell'e.getSource()..
vediamo un po' come va e poi ci penso :) grazie cmq, intanto! 

 pulsante e altre cosette varie..
Penso che qui ti sei davvero complicato la vita ... :-D
Questo esempio è un semplicissimo codice che cambia stato al pulsante
premuto e riporta allo stato attivo il pulsante precedentemente premuto.
Qui non ho fatto una buona distinzione Model e View, te lo dico subito.
---------------------------------------------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class button_test implements ActionListener
{
        final int numeroPulsanti=16;
        JButton[] arrPulsanti;
        int pulsantePrecedentementePremuto=-1;
 
        public void actionPerformed(ActionEvent e)
        {
                int i;
 
                if (pulsantePrecedentementePremuto!=-1)
                {
 
arrPulsanti[pulsantePrecedentementePremuto].setEnabled(true);
                }
 
                for (i=0;i<numeroPulsanti;i++)
                {
 
                        if (arrPulsanti[i].equals(e.getSource()))
                        {
                                arrPulsanti[i].setEnabled(false);
                                pulsantePrecedentementePremuto=i;
                        }
                }
        }
 
        button_test()
        {
                int i;
 
                JFrame f=new JFrame("Button Test");
                f.setLayout(new FlowLayout());
 
                arrPulsanti=new JButton[numeroPulsanti];
                for (i=0;i<numeroPulsanti;i++)
                {
                        arrPulsanti[i]=new JButton("Pulsante "+i);
                        arrPulsanti[i].addActionListener(this);
                        f.getContentPane().add(arrPulsanti[i]);
                }
 
                f.setSize(300,300);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
                f.setVisible(true);
        }
 
        public static void main(String[] args)
        {
                new button_test();
        }
}
---------------------------------------------------------------
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===