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

    Listener esterno a classe che genera l'evento

    Salve a tutti, prima volta su un forum e questo e' grandioso!!!
    Non sono molto pratico di Java, e Vi spiego il mio problema:
    ho un undecorated JFrame con un solo JButton nel mezzo; sul JButton aggiungo ActionListener, MouseListener e MouseMotionListener, ma...
    - se creo una sola classe JFrame che implements i vari listener e aggiungo il JButton, se trascino il tutto funziona bene...
    - se separo le varie classi, JFrame, JButton e classe Listener (che li implementa tutti insieme), non riesco a spostare il JFrame...

    A quanto ho capito il problema sta nel fatto che il JButton copre completamente il JFrame, che l'evento pressione del mouse (e conseguente drag...) viene generato dal JButton mentre il metodo setLocation() deve spostare il frame... mi spiego?!?!

    Grazie per le risposte che sicuramente arriveranno.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Listener esterno a classe che genera l'evento

    Originariamente inviato da Nukleo77
    - se separo le varie classi, JFrame, JButton e classe Listener (che li implementa tutti insieme), non riesco a spostare il JFrame...
    Riguardo la questione dei listener e dove sarebbe meglio implementarli, ne avevo parlato in questo post.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Listener in classi esterne e aggiornamenti del codice

    Innanzi tutto, grazie per la risposta, ma ora mi viene un dubbio:

    Se in futuro volessi cambiare solo l'aspetto del mio JButton, ma non il suo comportamento (o viceversa), dovrei comunque modificare sia la classe del pulsante che del suo listener e mi sembra che verrebbe meno il concetto dell'MVC oltre che quello della riusabilita' del codice (nell'ipotesi che creassi ad esempio tutti pulsanti triangolari, anziche' rettangolari)...

    Mi sai dire in che modo si possono aggiungere dei listener (MouseMotionListener e MouseListener in particolare) ad alcuni oggetti, che interagiscano con altri oggetti?

    Mi viene in mente un esempio: la scelta di un font da un elenco che al rilascio del tasto del mouse, viene applicato al testo gia' presente in una JTextArea...

    Grazie ancora.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    rifletti un po': cambi il modo con cui viene renderizzato a video o cambi la funzionalità?
    L'MVC non viene meno, prova a cambiare il look and feel
    RTFM Read That F*** Manual!!!

  5. #5

    Listener esterno a classe che genera l'evento

    Ciao. C'ho riflettuto un po' e forse perche' il tuo linguaggio e' troppo tecnico per il mio livello in Java, ma ti confermo che la classe Listener e' esterna alla classe che genera l'evento e ora ti posto il codice di tre classi che mi hanno risolto il problema:

    la prima crea il frame principale, che NON genera alcun evento, MA e' "destinatario" dell'azione intrapresa (dal Listener) dopo aver generato l'evento da un componente contenuto al suo interno:

    package jap;

    public class Jap {

    public static void main(String[] args) {
    f.setSize(200, 200);
    f.setVisible(true);
    }
    private static JapFrame f = new JapFrame("...");
    }

    ___
    La seconda classe E' il quella che contiene l'oggetto che genera l'evento:

    package jap;

    import javax.swing.JButton;
    import javax.swing.JFrame;

    public class JapFrame extends JFrame {

    public JapFrame(String title) {
    super(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    x.addActionListener(new JapFrameListener(this));
    add(x);
    }
    private JButton x = new JButton("cliccami");
    }

    ___
    Quest'ultima classe E' l'ascoltatore dell'evento (esterna all'oggetto che lo genera):

    package jap;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;

    public class JapFrameListener implements ActionListener {

    public JapFrameListener(JFrame parent) {
    f = parent;
    }

    public void actionPerformed(ActionEvent ae) {
    f.setTitle("bravo");
    }
    private JFrame f;
    }

    ___

    In buona sostanza ho esteso l'ascoltatore del bottone personalizzandolo in modo che accettasse come parametro l'oggetto su cui andra' a ricadere l'azione ( nel codice f.setTitle("bravo"); ) .
    In questo modo dovrei aver separato il codice dell'aspetto grafico (classe JapFrame), da quello del comportamento.
    Vi prego di commentare se Vi piace o meno la mia soluzione che spero possa essere utile anche ad altri utenti.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Listener esterno a classe che genera l'evento

    Originariamente inviato da Nukleo77
    In buona sostanza ho esteso l'ascoltatore del bottone personalizzandolo in modo che accettasse come parametro l'oggetto su cui andra' a ricadere l'azione ( nel codice f.setTitle("bravo"); ) .
    In questo modo dovrei aver separato il codice dell'aspetto grafico (classe JapFrame), da quello del comportamento.
    La azione che JapFrameListener compie è tutto sommato banale/minimale e "innocente", ovvero settare il titolo del JFrame che ha ricevuto dal costruttore.

    Ma rileggi cosa dicevo qui. Se in JapFrame avessi molti componenti che devono essere accessibili da JapFrameListener ..... che fai?

    Passi tutti i componenti al costruttore? (come fatto per il JFrame) Metti campi pubblici? Metti metodi pubblici? Hai colto il punto?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7

    Listener esterno a classe che genera l'evento

    Dunque, ci stavo lavorando adesso...
    Per ora sto creando Listener diversi, ognuno dei quali accetta parametri diversi a seconda dell'azione che si deve intraprendere:
    - nel MouseListener accetto l'oggetto su cui avviene l'azione e il punto in cui si dovra' aprire il PopupMenu
    - nel MouseMotionListener accetto l'oggetto su cui avviene l'azione, il punto in cui avviene il click del mouse e il punto in cui avviene il release del mouse, cosi' da spostare la finestra undecorated anche se non la trascino dalla barra del titolo.
    Dovrebbe funzionare. Appena finisco ti dico come e' andata...
    Pazienta solo un pochino, non sono tanto veloce col codice...

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 © 2026 vBulletin Solutions, Inc. All rights reserved.