Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [JAVA] applicare eventi ad un array

    Salve ragazzi, stò cercando di applicare degli eventi a dei pulsanti che ho espresso mediante l'utilizzo di un array:

    Ecco le classi:

    Grid.java

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    
    /* Questo pannello contiene tutti i pulsanti in una griglia con 6 righe e 5 colonne */
    public class Grid extends JPanel
    {
    	private MyButton[] pulsanti;
    	
    	public Grid(){
    		setLayout(new GridLayout(6,5));
    		
    		/* istanzio un array di tipo MyButton */
    		pulsanti = new MyButton[10];
    		
    		for (int i=0; i<10; i++){
    			pulsanti[i] = new MyButton(String.valueOf(i));
    		}
    		
    		for (int i=0; i<10; i++){ 
    			add(pulsanti[i]);
    		}
    	}
    }
    e poi ho la classe MyButton.java:
    codice:
    import javax.swing.*;
    import java.awt.GridLayout;
    
    public class MyButton extends JPanel {
    	private JButton pulsante;
    	public MyButton(String testo) {
    		setLayout( new GridLayout(1, 1) );
    		setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
    		pulsante = new JButton(testo);
    		add(pulsante);
    	}
    }
    Praticamente , mediante dei tutorial ho notato che l'azione ad un pulsante posso applicarlo in questo modo:
    codice:
    public class NomeClasse implements ActionListener {
        JButton bottone;
        public NomeClasse() {
        ...    
        bottone = new JButton("Cliccami");
        bottone.addActionListener(this);
        }
    }
    
    public void actionPerformed(ActionEvent e){
        display.setText("10");
    }
    
    // supponendo che abbia già creato l'oggetto di tipo JTextField. Quando clicco "Cliccami" , esce all'interno della textfield la scritta 10.
    Precisamente l'esempio funzionante è il seguente:
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class ActionExample extends JPanel implements ActionListener  {
    	
    	JTextField display;
    	JButton bottone;
    	
    	public ActionExample(){
    		display = new JTextField();
    		display.setEditable(false);
    		display.setPreferredSize(new  Dimension ( 237 ,  50 ));
    		display.setBackground(Color.white);
    		add(display);
    		
    		bottone = new JButton("Cliccami e uscirà 10 nella textField");
    		add(bottone);
    		
    		bottone.addActionListener(this);
    		
    	}
    	
    	public void actionPerformed(ActionEvent ae){
    		display.setText("10");
    		
    	}
    	
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("ListenerDemo");
    		frame.getContentPane().add(new ActionExample(), null);
    		frame.setSize(300, 150);
    		frame.setTitle("Prova action");
    		frame.setResizable(false);
    		frame.setVisible( true );
    	}
    }

    Adesso il mio problema è applicare l'evento ad ogni singolo pulsante dell'array, praticamente dovrei fare in modo che quando clicco, esce il numero all'interno della textField. Come posso fare?
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    14
    Devi aggiungere un actionListener ad ogni bottone che crei, io farei così:
    codice:
    import javax.swing.*;
    import java.awt.GridLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    public class MyButton extends JPanel{
    	private JButton pulsante;
    	public MyButton(String testo) {
    		setLayout( new GridLayout(1, 1) );
    		setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
    		pulsante = new JButton(testo);
                    pulsante.addActionListener(new MyListener());
    		add(pulsante);
    	}
            
            private class MyListener implements ActionListener {
                    public void actionPerformed(ActionEvent e) {
                            myTextField.setText(e.getSource().getText());
                    }
            }
    }

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Perdonami ma mi dà due errori col codice che hai postato tu e sono i seguenti:

    codice:
    display cannot be resolved e
    
    The method getText() is undefined for the type Object
    ecco il codice che ho ora:

    codice:
    import javax.swing.*;
    import java.awt.GridLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class MyButton extends JPanel {
    	private JButton pulsante;
    	public MyButton(String testo) {
    		setLayout( new GridLayout(1, 1) );
    		setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
    		pulsante = new JButton(testo);
    		pulsante.addActionListener(new MyListener());
    		add(pulsante);
    	}
    	
        private class MyListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                    display.setText(e.getSource().getText());
            }
        }
    }
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gaten
    display cannot be resolved
    In MyButton c'è una variabile JTextField (da qualche parte) che si chiama 'display'? No. E allora o il riferimento a quel JTextField lo passi ad esempio al costruttore di MyButton e lo tieni come variabile di istanza oppure realizzi un altro "design".

    Originariamente inviato da gaten
    The method getText() is undefined for the type Object
    getSource() restituisce il componente "sorgente" dell'evento ma lo restituisce come tipo Object ... che ovviamente non ha un getText().
    O fai il cast a JButton oppure prendi il testo direttamente da 'pulsante'. L'evento comunque è sempre e solo relativo a quel JButton (quindi il source è un JButton ed è esattamente quel 'pulsante').
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    scusami, in primis non riesco a capire perchè fa:

    codice:
    private class MyListener implements ActionListener
    che dichiara una classe, all'interno di un'altra classe (MyButton) ???

    Inoltre, io il valore lo devo far visualizzare nel JTextField chiamato display.
    Ecco la classe:
    codice:
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    
    /* Estendo la classe JPanel, poichè l'oggetto display sarà un componente
     * da aggiungere al BorderLayout della Windows
     */
    public class Display extends JPanel {
    	private JTextField display;
    	
    	/* Costruttore */
    	public Display() {
    		
    		/* Istanzio un oggetto di tipo JTextField */
    		display = new JTextField();
    		
    		/* Inserisco del testo all'interno della textarea */
    		display.setText("0");
    		
    		/* Dico che l'area non è editabile */
    		display.setEditable(false);
    		
    		/* Setto la larghezza e l'altezza della textField */
    		display.setPreferredSize ( new  Dimension ( 237 ,  50 )) ;
    		
    		/* Setto il colore di sfondo della textField */
    		display.setBackground(Color.white);
    		
    		/* Setto il font all'interno della textField */
    		display.setFont(new Font("sanserif", Font.BOLD, 36));
    		
    		/* Aggiungo il display al pannello */
    		add(display);
    	}
    }
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gaten
    codice:
    private class MyListener implements ActionListener
    che dichiara una classe, all'interno di un'altra classe (MyButton) ???
    Sì, è una "inner" class (per precisare una "regular" inner class, solo per distinguerla dalle inner class "anonymous" e "local").

    Originariamente inviato da gaten
    Inoltre, io il valore lo devo far visualizzare nel JTextField chiamato display.
    Ma MyButton non ha di per sé, da solo, il riferimento a quel display .... devi passarglielo tu. O realizzare un'altra architettura.
    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.