Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Passare variabile da Listener a Main

    Ciao a tutti ho da poco iniziato le interfacce grafiche in java e sto provando a sviluppare un impiccato.

    Questo è il codice del Main:


    codice:
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.util.Random;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    
    public class Main {
        public static void main(String[] args){
            String words[] = {"contemporaneamente", "girasole", "tastiera", "gatto", "computer", "porta", "letteratura"};//parole utilizzabili nel gioco
            Random rand = new Random();
            String randomWord = words[rand.nextInt(words.length)];//assegna alla variabile una parola a random
            Window win = new Window("Impiccato", 150, 150, 650, 650);
            win.displayButtons();
            win.displayLabels(randomWord);
            win.listenButtons();
        }
    }
    Mentre questo è il codice del listener:

    codice:
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    
    import javax.swing.JButton;
    
    
    public class MouseLis implements MouseListener{
        
        public void mouseReleased(MouseEvent e){
            
            JButton button = (JButton)e.getSource();
            System.out.println(button.getText());
            button.setEnabled(false);
        }
        
        public void mousePressed(MouseEvent e){
            
        }
        
        public void mouseEntered(MouseEvent e){
            
        }
        
        public void mouseExited(MouseEvent e){
            
        }
        
        public void mouseClicked(MouseEvent e){
            
        }
    }
    Come potete notare stampa a video il testo del bottone, ma io vorrei in qualche modo passarlo al main, chi mi da una mano?
    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ciao

    Ho aspettato un po' a rispondere perché dal punto di vista teorico non sono ferratissimo e magari qualcuno poteva darti qualche dritta più precisa ...

    Comunque la tua richiesta di "passare al main" il testo del bottone è posta male. Nel senso che per passare al metodo main (che è un metodo statico) il testo del bottone che clicchi dovresti in qualche modo fare in modo che ci sia un metodo, richiamato dal tuo main, che restituisce tale stringa come valore di ritorno.

    Penso, correggimi se sbaglio, che fosse qualcosa di simile a quello che volevi fare con quel:

    codice:
    win.listenButtons();
    almeno dal nome del metodo della tua classe Window (a proposito, pessima idea usare il nome di una classe già esistente come Window, soprattutto dal momento che stai usando classi dello stesso package java.awt), di cui non hai postato il codice.

    Ora, quando si usano dei listener, devi ragionare "per eventi", tu registri un listener e all'interno dei metodi di cui fai l'ovveride (come mouseReleased) ti preoccupi di stabilire cosa deve succedere quando viene registrato un evento (che tipicamente non controlli tu).
    Non è sensato creare una specie di loop nel metodo main o in qualche altro luogo, dove aspetti all'infinito che qualcuno ti notifichi di un evento.

    Quindi da MouseLis non dovresti preoccuparti di comunicare al metodo main il fatto che un bottone è stato rilasciato, forse si potrebbe anche fare ma penso sarebbe una pratica "barbara".

    Se invece intendevi dire che vorresti poter avere un metodo (in una tua classe, ad esempio Window, a cui consiglio ancora di cambiare nome), che riceve il testo del bottone premuto e fa qualcosa in base alla stringa passata, questo è fattibile.
    Potresti ad esempio passare a MouseLis, ad esempio tramite costruttore, l'istanza creata di Window, che salvi in una variabile all'interno della classe MouseLis.

    Poi all'interno di mouseReleased basta richiamare il metodo creato sulla specifica istanza di Window.

    Nota comunque che questo giro non dovrebbe essere necessario, in particolare di solito si tende ad avere un listener specifico per ogni bottone (spesso "anonimo"), in questo modo non devi preoccuparti di riconoscere la sorgente dell'evento, perché all'interno di ogni metodo sai già qual'è il bottone che è stato premuto e cosa devi fare, senza aver bisogno di fare ad esempio una cascata di if dove confronti il testo dei bottoni con la stringa ricevuta dal metodo.

    Questo ti mette anche al riparo da possibili fonti di errori, ed è una soluzione più pulita (almeno secondo la mia non troppo vasta esperienza).
    Se ti preoccupa il fatto di dover scrivere un sacco di codice per ogni bottone ci sono altri tipi di soluzione: ad esempio ho visto che il corpo di tutti i metodi eccetto mouseReleased è vuoto, se in seguito non vuoi effettivamente scriverli ma li hai inseriti solo perché lo richiede l'implementazione di MouseListener, potresti considerare l'idea di estendere MouseAdapter anziché implementare MouseListener (anche se di solito per i bottoni si utilizza maggiormente un ActionListener, a meno che tu non voglia fare cose particolari quando il mouse entra/esce etc.).

Tag per questa discussione

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.