Visualizzazione dei risultati da 1 a 9 su 9

Visualizzazione discussione

  1. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da mammolos Visualizza il messaggio
    però questo programmino per me serve solo a scopo didattico tanto per capire l'interazione tra frame anche perché potrebbero capitare casi un cui una dialog non sia sufficiente.
    Ok, va bene, se il senso e l'obiettivo è questo, non ho altre obiezioni.

    Quote Originariamente inviata da mammolos Visualizza il messaggio
    Quindi come posso ritornare un oggetto inserito da una seconda finestra alla prima in modo che questa "aspetti" che l'altra abbia completato l'input? Si può? Se no, l'unico modo per fare tutto e passare i riferimenti degli oggetti su cui si vuole operare alla seconda finestra in modo che faccia tutto lei una volta premuto il pulsante di conferma?
    Certo che si può e anche in svariati modi (dai più eleganti e "puliti" a quelli più "barbari").
    Ne dico giusto 2 davvero basilari (anche se non ottimali).

    Chiamerò il frame con la tabella AnagraficheFrame e quello per la editazione AnagraficaEditFrame. All'interno di AnagraficheFrame da qualche parte e in un certo momento andrai sicuramente ad istanziare un AnagraficaEditFrame. Il succo è che AnagraficheFrame HA quindi di certo il riferimento all'oggetto AnagraficaEditFrame. Questa è la base.

    Soluzione 1)
    Quando istanzi il AnagraficaEditFrame passi al suo costruttore il riferimento al AnagraficheFrame. Questo vuol anche dire che in questo caso AnagraficaEditFrame HA il riferimento al frame AnagraficheFrame.
    In AnagraficheFrame metti un metodo esposto all'esterno es. public void aggiungiAnagrafica(Anagrafica) (che come si può immaginare andrà ad inserire la anagrafica nella tabella).
    In AnagraficaEditFrame avrai di certo la gestione di un ActionListener per il "Conferma". Nel actionPerformed, prenderai i dati dai componenti, creerai un Anagrafica e invocherai quel aggiungiAnagrafica sul AnagraficheFrame (perché ripeto, HAI il riferimento).

    Soluzione 2)
    In AnagraficaEditFrame metti un metodo esposto all'esterno es. public void addConfermaActionListener(ActionListener). Esso farà semplicemente da passacarte e passerà il ActionListener al addActionListener del JButton "Conferma".
    Sempre in AnagraficaEditFrame metti un metodo esposto all'esterno es. public Anagrafica getAnagrafica() che prende i dati dai componenti, crea un Anagrafica e lo restituisce.
    Poi in AnagraficheFrame implementi un ActionListener (come/dove non è molto importante) e lo passi al addConfermaActionListener invocato chiaramente sulla istanza di AnagraficaEditFrame.
    Qui il succo è che quando "Conferma" viene azionato, il listener notificato è in AnagraficheFrame invece che in AnagraficaEditFrame. Il suo actionPerformed semplicemente invocherà getAnagrafica sul AnagraficaEditFrame e siamo allo stesso punto della soluzione 1, cioè in AnagraficheFrame hai un oggetto Anagrafica da inserire nella tabella.


    Come vedi sono due soluzioni differenti ma con lo stesso obiettivo e risultato. Cambia solo CHI fa COSA rispetto a CHI. Queste due soluzioni non sono nulla di che ... e nemmeno davvero buone e ottimali. Sono semplicemente l'uso basilare di oggetti e riferimenti. Perché se noti è sempre un metodo (almeno uno) X invocato su un oggetto Y. Su questo non si scappa.

    Cambiano invece le relazioni tra le due classi. Nel primo caso le due classi sono strettamente legate tra di loro, perché AnagraficaEditFrame SA di AnagraficheFrame e ci invoca un metodo specifico. Questo in generale non è buono.
    Nel secondo caso AnagraficaEditFrame riceve da AnagraficheFrame soltanto un ActionListener (è una interfaccia), che può essere implementato in maniera differenza ma è tutto lì, non sa altro di specifico.

    Se tu volessi (ri)usare AnagraficaEditFrame anche da un'altra classe es. RevisioneAnagraficheFrame, con la soluzione 2 puoi riutilizzare AnagraficaEditFrame anche in questa perché non c'è un legame così stretto. La soluzione 1 non andrebbe bene se avevi già legato AnagraficaEditFrame direttamente a AnagraficheFrame.

    Ultima cosa: quello che NON dovrai mai fare è "esporre" o passare componenti grafici tra le due classi. Questo è proprio lo scenario da evitare come la peste.


    Se tutto questo ti risulta chiaro, allora come si dice "sei a cavallo" e puoi sicuramente andare anche oltre. Se non ti è chiaro, rileggi il tutto e magari poni domande.
    Ultima modifica di andbin; 10-10-2016 a 21:18
    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.