JButton Array []

di il
9 risposte

JButton Array []

Salve ragazzi, come da titolo ho un problemino con l'implementazione di un JButton array.

Praticamente devo aggiungere vari bottoni avente nomi diversi, li devo rendere trasparenti e vorrei aggiungerci un ActionListener uguale per tutti i bottoni.

Ho implementato il seguente codice ma non so perchè non va...
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Tabella extends JFrame implements ActionListener {

private JButton irlanda,regnounito,islanda;
private JButton array[] = {irlanda, regnounito, islanda};

public Tabella(){

setLayout(null);
setResizable(false);
setLocationRelativeTo(null);
setSize(1650,1080);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setIconImage(new ImageIcon(getClass().getResource("/immagini/europa.png")).getImage());

irlanda = new JButton();
irlanda.setBounds(168,279,15,15);

islanda = new JButton();
islanda.setBounds(138,38,15,15);

regnounito = new JButton();
regnounito.setBounds(222,336,15,15);

for(int i=0;i<array.length;i++){

array.setOpaque(false);
array.setContentAreaFilled(false);
array.setBorderPainted(false);
add(array);
array.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
JOptionPane.showMessageDialog(null, "Hello");
}
}
});

((JPanel)getContentPane()).setOpaque(false);
ImageIcon uno = new ImageIcon(this.getClass().getResource("/immagini/europa.png"));
JLabel fondo = new JLabel();
fondo.setIcon(uno);
getLayeredPane().add(fondo,JLayeredPane.FRAME_CONTENT_LAYER);
fondo.setBounds(0,0,uno.getIconWidth(),uno.getIconHeight());


}

@Override
public void actionPerformed(ActionEvent ae) { }

}




Grazie per la pazienza

9 Risposte

  • Re: JButton Array []

    Javier ha scritto:


        private JButton irlanda,regnounito,islanda;
        private JButton array[] = {irlanda, regnounito, islanda};
    
    Questo è già un problema concettuale che forse non hai ancora compreso. La esecuzione degli inizializzatori delle variabili di istanza avviene poco dopo la invocazione del super-costruttore (il costruttore della super-classe) e prima della esecuzione del corpo del tuo costruttore.

    L'array di JButton viene creato con i valori di irlanda, regnounito, islanda che ci sono in quel momento. E in quel preciso momento sono null.

    Il fatto che poi dopo, nel costruttore, assegni qualcosa alle tre variabili irlanda, regnounito, islanda, NON cambia ciò che è stato messo nell'array durante la costruzione di quell'array.
  • Re: JButton Array []

    Ok, quindi cosa mi consigli di fare? qual'è la strada giusta?
  • Re: JButton Array []

    Javier ha scritto:


    Ok, quindi cosa mi consigli di fare? qual'è la strada giusta?
    1) Inizializzazione di tutti quei campi:
    private JButton irlanda = new JButton( .... );
    private JButton regnounito = new JButton( .... );
    private JButton islanda = new JButton( .... );
    private JButton[] array = {irlanda, regnounito, islanda};
    poi puoi ovviamente configurarli meglio nel costruttore. Ma i reference sono già fissati e quindi valgono per la creazione dell'array.


    2) Tutta la inizializzazione la fai nel costruttore. E avrai solo:
    private JButton irlanda;
    private JButton regnounito;
    private JButton islanda;
    private JButton[] array;
    Personalmente preferisco la 2), per non "appesantire" tutta la parte dove ci sono le variabili di istanza.
  • Re: JButton Array []

    Ah, per la 2) tutti quei private JButton .... NON vanno ovviamente dentro il costruttore!
    Le dichiarazioni delle variabili di istanza vanno sempre fuori da costruttori/metodi.

    Mentre tutte le inizializzazioni le fai nel costruttore:
       .....
    private JButton irlanda;
    private JButton regnounito;
    private JButton islanda;
    private JButton[] array;
    
    public Tabella() {
        irlanda = new JButton( ..... );
        .....
    
        array = new JButton[] { irlanda,  ........ };
    
        ....
    }
  • Re: JButton Array []

    Mi da comunque un errore
    Exception in thread "main" java.lang.NullPointerException
    at Tabella.<init>(Tabella.java:62)
    at Prova.main(Prova.java:19)
    Java Result: 1

    e l'errore mi porta al seguente punto
    array[i].addActionListener(new ActionListener()
  • Re: JButton Array []

    Javier ha scritto:


    Mi da comunque un errore
    Exception in thread "main" java.lang.NullPointerException
    at Tabella.<init>(Tabella.java:62)
    at Prova.main(Prova.java:19)
    Java Result: 1

    e l'errore mi porta al seguente punto
    array[i].addActionListener(new ActionListener()
    Senza vedere esattamente cosa hai scritto ... è difficile capire se hai combinato "casini".
    Quanto ti ho scritto io, sebbene abbozzato, è corretto.
  • Re: JButton Array []

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JLayeredPane;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    
    
    public class Tabella extends JFrame implements ActionListener {
        
        
        private JButton irlanda,islanda,regnounito = new JButton ();
        private JButton array[];
         
        
        
       
        
        public Tabella(){
            
            array = new JButton[] {irlanda, islanda, regnounito};
            setLayout(null);
            setResizable(false);
            setLocationRelativeTo(null);
            setSize(1650,1080);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setIconImage(new ImageIcon(getClass().getResource("/immagini/europa.png")).getImage());
            
            irlanda = new JButton();
            irlanda.setBounds(168,279,15,15);
            irlanda.setOpaque(false);
            irlanda.setContentAreaFilled(false);
            irlanda.setBorderPainted(false);
            add(irlanda);
                    
            islanda = new JButton();
            islanda.setBounds(138,38,15,15);
            islanda.setOpaque(false);
            islanda.setContentAreaFilled(false);
            islanda.setBorderPainted(false);
            add(islanda);
                    
            regnounito = new JButton();
            regnounito.setBounds(222,336,15,15);
            regnounito.setOpaque(false);
            regnounito.setContentAreaFilled(false);
            regnounito.setBorderPainted(false);
            add(regnounito);
            
            ((JPanel)getContentPane()).setOpaque(false);
            ImageIcon uno = new ImageIcon(this.getClass().getResource("/immagini/europa.png"));
            JLabel fondo = new JLabel();
            fondo.setIcon(uno);
            getLayeredPane().add(fondo,JLayeredPane.FRAME_CONTENT_LAYER);
            fondo.setBounds(0,0,uno.getIconWidth(),uno.getIconHeight()); 
            for(int i=0;i<3;i++)
            {
                
                array[i].addActionListener(new ActionListener()
        {
        @Override
        public void actionPerformed(ActionEvent ae) {
            
            
                JOptionPane.showMessageDialog(null, "Hello");
            
            
            
             }
        });
        
    }
        }
    
        @Override
        public void actionPerformed(ActionEvent ae) {}
    }
  • Re: JButton Array []

    Javier ha scritto:


        private JButton irlanda,islanda,regnounito = new JButton ();
        private JButton array[];
         
        public Tabella(){
            
            array = new JButton[] {irlanda, islanda, regnounito};
            
            irlanda = new JButton();
                    
            islanda = new JButton();
                    
            regnounito = new JButton();
    
    Stesso problema: stai creando l'array PRIMA di aver assegnato reference validi alle tre variabili (a parte per regnounito, che probabilmente ti è ancora scappato quel new JButton() che non serve).
  • Re: JButton Array []

    PERFETTO andbin, adesso ho capito perfettamente cosa volevi dire...è FONDAMENTALE l'ordine in base al quale avvengono le operazioni.

    Grazie davvero, ti devo una birra
Devi accedere o registrarti per scrivere nel forum
9 risposte