Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412

    [JAVA] Per quale motivo la classe windowAdapter non implementa di default la chiusura della finestra?

    Nella classe windowAdapter c'è il metodo windoClosing, ma per quale motivo se questo non viene overridato non sortisce alcun effetto?
    Mi spiego, almeno stando a quello che spiega questa guida di Uninettuno (attorno al minuto 26)
    http://www.youtube.com/watch?v=s7I-drhSVBM

    bisogna innazitutto creare il frme, poi creare un'istanza di windowAdapter e poi ovverridare il metodo windowClosing. Per quale motivo di default questo metodo non applica il System.exit()? E considerando ciò, qual è allora la sua reale funzione di default?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    WindowAdapter è una classe "adapter", appunto. Ossia una classe che implementa vuoti tutti i metodi di un'interfaccia: WindowListener, in questo caso.

    Essendo che tutti i suoi metodi sono implementati vuoti, da sola non serve a nulla.

    Qual è allora lo scopo di questa classe? Semplice: semplificare la vita al programmatore.
    Se tu dovessi aggiungere un WindowListener alla tua finestra, dovresti occuparti di implementare manualmente tutti i metodi di tale interfaccia:

    codice:
    - windowActivated(WindowEvent e)
    - windowClosed(WindowEvent e)
    - windowClosing(WindowEvent e)
    - windowDeactivated(WindowEvent e)
    - windowDeiconified(WindowEvent e)
    - windowIconified(WindowEvent e)
    - windowOpened(WindowEvent e)
    E' mostruosamente noioso dover implementare tutti questi metodi solo per poter chiudere una finestra... allora si sono inventati gli adapter: classi che già implementano concretamente tutti questi metodi (vuoti) e che tu puoi usare per fare l'override solo del metodo che ti serve (o di quei pochi che ti servono). Tutto il resto del lavoro (ovvero implementare come vuoti tutti i metodi "inutili") è già stato fatto per te. Per chiudere una finestra è sufficiente intercettare l'evento "windowClosing()". Bene, uso un adapter e ridefinisco solo quel metodo.

    Ce ne sono molti di "adapter": WindowAdapter, MouseAdapter, MouseMotionAdapter, ecc.
    In linea di massima se ne trova uno per ciascuna interfaccia che possiede più di un metodo (ma non è la regola... non tutte le interfacce sono previste di adapter).

    PS: Di per sé non è detto che l'evento windowClosing() debba per forza portare alla chiusura dell'applicazione/finestra. Potresti anche voler "abortire" l'operazione in caso di errori/warnings. Quindi, sarebbe abbastanza "grave" che un Adapter lo facesse di sua spontanea volontà.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    capisco.
    Ma perchè dici

    Se tu dovessi aggiungere un WindowListener alla tua finestra, dovresti occuparti di implementare manualmente tutti i metodi di tale interfaccia:
    cosa accadrebbe se implementassi giusto quello che mi serve senza dichiarare i metodi "superflui" quali ad esempio windowIconified, windowActivated, etc etc??

    Poi c'è un'altra cosa che non mi è chiara dell'esempio, ovvero:

    WindowListener wl;
    wl=new WindowAdapter()
    {
    public void windowClosing(WindowEvent we)
    {
    System.exit(1);
    }
    perchè l'overriding viene fatto sulla classe WindowAdapter e non sulla WindowListener? Senza contare che stando alla teoria, le classi astratte sono classi che non vengono mai istanziate, perchè quindi in quel caso viene fatto?
    Ultima modifica di American; 15-10-2013 a 14:35

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da American Visualizza il messaggio
    cosa accadrebbe se implementassi giusto quello che mi serve senza dichiarare i metodi "superflui" quali ad esempio windowIconified, windowActivated, etc etc??
    Che non ti compila. Se fai una classe "concreta" (non a sua volta astratta) che ha come super-tipi qualcosa di "astratto" (estende una classe astratta (nota: che ha metodi astratti!) o implementa una interfaccia, che è astratta), sei obbligato a "concretizzare" tutti i metodi. Altrimenti appunto non compila.

    Quote Originariamente inviata da American Visualizza il messaggio
    Poi c'è un'altra cosa che non mi è chiara dell'esempio, ovvero:

    perchè l'overriding viene fatto sulla classe WindowAdapter e non sulla WindowListener? Senza contare che stando alla teoria, le classi astratte sono classi che non vengono mai istanziate, perchè quindi in quel caso viene fatto?
    È WindowAdapter che implementa "concretamente" in primis i metodi della interfaccia. Se estendi WindowAdapter puoi fare un override a sua volta di uno o più (e appunto non necessariamente tutti) dei suoi metodi.
    Ultima modifica di andbin; 15-10-2013 a 14:48
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da American Visualizza il messaggio

    cosa accadrebbe se implementassi giusto quello che mi serve senza dichiarare i metodi "superflui" quali ad esempio windowIconified, windowActivated, etc etc??
    Semplicemente non potresti avviare il programma perchè avresti errore di compilazione.

    Quote Originariamente inviata da American Visualizza il messaggio
    Poi c'è un'altra cosa che non mi è chiara dell'esempio, ovvero:
    perchè l'overriding viene fatto sulla classe WindowAdapter e non sulla WindowListener?
    Appunto come ti è stato detto prima, per non dover definire tutti i metodi contenuti nell'interfaccia WindowListener.

    Quote Originariamente inviata da American Visualizza il messaggio
    Senza contare che stando alla teoria, le classi astratte sono classi che non vengono mai istanziate, perchè quindi in quel caso viene fatto?
    Dalle tue domande si deduce che hai saltato le basi della programmazioni OOP per buttarti dentro a swing...., consiglio spassionato fai un passo indietro e dai un occhio All'ereditarietà, Polimorfismo (le basi dell'OOP)etc...
    Quello che vedi è un "Inner Class" che appunto instanzia una classe astratta ridefinendo i metodo astratti contenuti in essa.

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da American Visualizza il messaggio
    cosa accadrebbe se implementassi giusto quello che mi serve senza dichiarare i metodi "superflui" quali ad esempio windowIconified, windowActivated, etc etc??
    Errore di compilazione: tutti i metodi dell'interfaccia devono essere implementati (a meno che la classe non sia astratta ma in questo caso non la puoi istanziare)

    Quote Originariamente inviata da American Visualizza il messaggio
    perchè l'overriding viene fatto sulla classe WindowAdapter e non sulla WindowListener? Senza contare che stando alla teoria, le classi astratte sono classi che non vengono mai istanziate, perchè quindi in quel caso viene fatto?
    WindowListener wl = new WindowAdapter() è perfettamente legale perché:
    1. WindowAdapter è una classe concreta (non astratta)
    2. WindowAdapter è-un WindowListener
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Dalle tue domande si deduce che hai saltato le basi della programmazioni OOP per buttarti dentro a swing....,
    Niente affatto, allo swing neanche ci sono arrivato..

    WindowListener wl = new WindowAdapter() è perfettamente legale perché:
    1. WindowAdapter è una classe concreta (non astratta)
    2. WindowAdapter è-un WindowListener
    Stando alla documentazione ufficiale sul secondo punto hai ragione in quanto WA implementa WL. Ma sul fatto che WL sia una classe concreta mi suona nuovo in quanto è detto chiaramente che è astratta
    http://docs.oracle.com/javase/7/docs...owAdapter.html


    Quello che vedi è un "Inner Class"
    Le inner class non sono classi scritte all'intenro di un'altra classe? Se WA dovesse essere una inner class allora dovrebbe essere contenuta in WL. Invece effettua l'implements di WL. Anche in questo caso si parla di inner class?
    Ultima modifica di American; 16-10-2013 a 07:26

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da American Visualizza il messaggio
    Stando alla documentazione ufficiale sul secondo punto hai ragione in quanto WA implementa WL. Ma sul fatto che WL sia una classe concreta mi suona nuovo in quanto è detto chiaramente che è astratta
    WindowListener è una interfaccia che è, per definizione in Java, abstract (una interfaccia è concettualmente da vedere come se fosse una classe astratta al 100%)
    WindowAdapter è una classe che implementa WindowListener e dalla documentazione javadoc si evince pure che WindowAdapter è a sua volta una classe astratta.
    Nota: anche le altre classi "adapter" in java.awt.event sono abstract !
    Questo vuol dire che un adapter deve essere esteso per fare qualcosa di reale, concreto.

    Quote Originariamente inviata da American Visualizza il messaggio
    Le inner class non sono classi scritte all'intenro di un'altra classe?
    Sì, una inner class è, in generale, una classe che è definita dentro un altro tipo (a differenza delle normali classi dette "top level", non contenute dentro un altro tipo).
    Ma ci sono 3 tipi di "inner" class:
    - le inner class normali, dette anche "regular", che sono membri diretti di una classe.
    - le "local" inner class, definite dentro un metodo (o costruttore o initialization-block) con il costrutto class.
    - le "anonymous" inner class, in cui il punto di definizione e di istanziazione in pratica coincide e che ha una sintassi un po' più particolare.

    Quote Originariamente inviata da American Visualizza il messaggio
    Niente affatto, allo swing neanche ci sono arrivato..
    Capisco e non voglio criticarti, ci mancherebbe. Ma quello che si evince è che comunque hai "sorvolato" su un po' di cose relative al linguaggio Java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da American Visualizza il messaggio
    Stando alla documentazione ufficiale sul secondo punto hai ragione in quanto WA implementa WL. Ma sul fatto che WL sia una classe concreta mi suona nuovo in quanto è detto chiaramente che è astratta
    http://docs.oracle.com/javase/7/docs...owAdapter.html
    Hai ragione scusami, è un po' che non tocco Swing e questo particolare mi era sfuggito ^^'
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    aridaje

    Swing a stento so cos'è (è un package contenente classi utili per le interfacce grafiche no?)

    Capisco e non voglio criticarti, ci mancherebbe. Ma quello che si evince è che comunque hai "sorvolato" su un po' di cose relative al linguaggio Java.
    Non le ho sorvolate giuro! Ho seguito la guida indtorduttiva a java del sito nonché visionato i vari video di uninettuno sulla programamzione ad oggetti in java. Non sto dicendo ovviamente che questo basti, ma dire che non conosca cosa è l'ereditarietà, il polimorfismo e l'incapsulamento è esagerato.
    Poi sicuramente non sono un genio complice anche il basso livello di concentrazione e per capirle le cose me le devo leggere e rileggerle, senza contare che senza la pratica la teoria me la scordo dopo 1 ora.

    WindowAdapter è una classe che implementa WindowListener e dalla documentazione javadoc si evince pure che WindowAdapter è a sua volta una classe astratta.
    Appunto, è quello che ho detto. Ma ho anche fatto notare che le classi astratte sono classi che per definizione non vengono mai istanziate.
    Eppure tornando al pezzo di codice proposto ad inizio topic, a me pare proprio che venga istanziata:
    WindowListener wl;
    wl=new WindowAdapter()

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.