Interfaccia grafica

di il
50 risposte

Interfaccia grafica


 ...
	finestra.addWindowListener(new WindowAdapter()
	{
	      public void windowClosing(WindowEvent e)
	      {
	        System.exit(0);
	      }
	});
		
...
Ciao.
Sto programmando un interfaccia grafica.
Voglio creare una sola finestra, su cui gira tutta l'interfaccia dell'utente.
La immagino cosi: al bordo di sx, i menù, che sono fissi e non si spostano mai di li.
La restante parte della finestra, toglierà, aggiungera bottoni, box ecc, in base a quello che si sceglie nel menu'
Dato che tutto il programma si svolge in un unica finestra, ho pensato di creare
una finestra di base che definisce il layout e la dimensioni della finestra, poi delle classi che svolgono i loro metodi e ridefiniscono un pò la finestra, in base alla scelta del programmatore.
Cioè se sceglie Anagrafica, vedrà box per nome cognome eccetera, mentre se sceglie Professione, verdrà box per lavoro, salario, ecc.
Ovviamente come detto tutto questo avviene nella singola finestra, che cambia aspetto in base alla scelta nel menù.

Per realizzare questo ho creato una classe abstract, che non istanzia nessun oggetto, ma per l'appunto posso usarla come base.
Il metodo windowClosing, voglio lasciarlo in questa mia classe base, cosi da non doverlo sempre scrivere, tanto è uguale. La X chiude il programma.
A questo punto, mi trovo con un oggetto di base finesta.
Dalla classe finestra, creo le altre sottoclassi, che sarebbero Anagrafica, Professione ecc.
Fatto ciò avrò che tutte le classi Anagrafica, Professione ecc, che estendono FinestraBase, e contengono metodi è bottoni diversi.
E' giusto progettarla cosi??

Per quanto riguarda gli ascoltatori ho pensato che la soluzione migliore sia di creare una classe che gestisce gli eventi.
Avrò quindi
1 classe base per la finestra
diverses sottoclassi della classe finestra
1 classe per gestire gli eventi.

Il codice sopra??
Se la classe WindowAdapter è una classe abstract, come fà ad instanziarla con new??

Ma cosa succede??
finestra.addWindowsListner() aggiunge un ascoltatore al JFrame

L'ascoltatore è un oggetto WindowAdapter, che invoca il metodo windowClosing??
tutto avviene alla chiamata del metodo addWindowListner??
(new WindowAdapter(
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
l'oggetto windowAdapter asce e muore con il metodo stesso

scusatemi x il monologo

50 Risposte

  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Voglio creare una sola finestra, su cui gira tutta l'interfaccia dell'utente.
    La immagino cosi: al bordo di sx, i menù, che sono fissi e non si spostano mai di li.
    La restante parte della finestra, toglierà, aggiungera bottoni, box ecc, in base a quello che si sceglie nel menu'
    Per "menù" cosa intendi? Perché in genere e tipicamente si parla della barra dei menù, che di norma è in alto e larga quanto la finestra (insomma, come tutte le applicazioni che conosci). Non "al bordo sx".

    Alexxandro ha scritto:


    Dato che tutto il programma si svolge in un unica finestra, ho pensato di creare
    una finestra di base che definisce il layout e la dimensioni della finestra, poi delle classi che svolgono i loro metodi e ridefiniscono un pò la finestra, in base alla scelta del programmatore.
    Cioè se sceglie Anagrafica, vedrà box per nome cognome eccetera, mentre se sceglie Professione, verdrà box per lavoro, salario, ecc.
    Ovviamente come detto tutto questo avviene nella singola finestra, che cambia aspetto in base alla scelta nel menù.

    Per realizzare questo ho creato una classe abstract, che non istanzia nessun oggetto, ma per l'appunto posso usarla come base.
    Il metodo windowClosing, voglio lasciarlo in questa mia classe base, cosi da non doverlo sempre scrivere, tanto è uguale. La X chiude il programma.
    A questo punto, mi trovo con un oggetto di base finesta.
    Dalla classe finestra, creo le altre sottoclassi, che sarebbero Anagrafica, Professione ecc.
    Fatto ciò avrò che tutte le classi Anagrafica, Professione ecc, che estendono FinestraBase, e contengono metodi è bottoni diversi.
    E' giusto progettarla cosi??
    . Innanzitutto parli di avere una "unica finestra" (io intendo "frame", ovvero JFrame in Swing). Ma se fai una classe base per la finestra e poi N sottoclassi, vuol dire che quando istanzierai una sottoclasse, dovrai aprire una NUOVA finestra. E quindi .... non è più una unica finestra.

    Semmai sarebbe più sensato avere una unica finestra in cui all'interno "scambi" pannelli mostrandone uno solo per volta. E ci sono diverse tecniche per farlo.

    Alexxandro ha scritto:


    Per quanto riguarda gli ascoltatori ho pensato che la soluzione migliore sia di creare una classe che gestisce gli eventi.
    Avrò quindi
    1 classe base per la finestra
    diverses sottoclassi della classe finestra
    1 classe per gestire gli eventi.
    (anche qui). La gestione degli eventi è una cosa che va fatta generalmente nel modo più "intimo" possibile (cioè più vicino) con la parte che gestisce i componenti e la interfaccia utente correlata all'evento. Se la classe che gestisce gli eventi è esterna alla classe dove ci sono i componenti, rischi di dover fare scelte di "design" errate per scambiare dati o rendere "troppo" accessibili all'esterno funzionalità e informazioni.

    Alexxandro ha scritto:


    Il codice sopra??
    Il codice sopra non è sbagliato. Ma se vuoi solo far terminare la applicazione, non c'è bisogno di un WindowListener. Basta impostare sul JFrame il "default close operation" (vedi il setDefaultCloseOperation).

    Alexxandro ha scritto:


    Se la classe WindowAdapter è una classe abstract, come fà ad instanziarla con new??
    Sì, WindowAdapter è astratta. Ma il punto è che il costrutto di una "anonymous inner class" permette di fare una (e solo una) delle due seguenti cose:
    - definire e istanziare una classe "anonima" che estende una classe Xyz
    oppure
    - definire e istanziare una classe "anonima" che implementa una interfaccia Xyz

    Quindi devi comprendere bene cosa sono le "inner class" e in particolare quelle "anonymous".

    Alexxandro ha scritto:


    Ma cosa succede??
    finestra.addWindowsListner() aggiunge un ascoltatore al JFrame

    L'ascoltatore è un oggetto WindowAdapter, che invoca il metodo windowClosing??
    tutto avviene alla chiamata del metodo addWindowListner??
    Quando registri un listener, nessuno dei metodi del listener viene subito chiamato in quel momento! Tu passi al addXyzListener un oggetto. Al componente su cui invochi addXyzListener NON interessa che oggetto è e di quale classe. Al componente interessa solo che l'oggetto implementi quella interfaccia XyzListener che sostanzialmente funge da "contratto" tra te che vuoi registrare il listener e il componente che la usa.

    Il componente si tiene referenziato l'oggetto del listener tipicamente in una lista. Quando poi succede "quel evento", il componente invocherà il metodo del listener apposito su tutti i listener registrati.

    Tutto questo è il classico meccanismo di "callback". È come se qualcuno mi fornisse il suo numero di telefono, io me lo annoto e poi quando mi serve lo chiamo. Concettualmente proprio questo.
  • Re: Interfaccia grafica

    Sto proprio fuori strada.
    Non so se si è capito bene cosa voglio fare.
    Ma non mi è chiaro come si crea un interfaccia..devo riguardare l'argomento

    Grazie
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Sto proprio fuori strada.
    Non so se si è capito bene cosa voglio fare.
    Ma non mi è chiaro come si crea un interfaccia..devo riguardare l'argomento
    Guarda, lo dico così senza alcuna intenzione negativa, probabilmente la realizzazione di una interfaccia grafica complessa, con menù, viste multiple ecc.. non è ancora molto alla tua portata.
    Hai (già) provato a realizzare qualcosa di più semplice? Non so ... una piccola utility grafica, ad esempio un generatore di password o un "calcolatore"/"convertitore" di qualcosa o cose del genere.

    P.S. magari dai anche una occhiata ai miei esempi Java su Swing.
  • Re: Interfaccia grafica

    Sto mettendo il piede sull'acceleratore, perchè il lavoro mi anniente la giornata, specialmente in questi giorni.
    Tornando a java, mi sembra di capire che la classe Base deve contenere oltre agl'attributi, anche i comportamenti, che saranno invocati dalle classi figlie, della classe base. Queste sottoclassi cambiaranno la struttura del contenuto del JFrame, ossia il Content??
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Tornando a java, mi sembra di capire che la classe Base deve contenere oltre agl'attributi, anche i comportamenti, che saranno invocati dalle classi figlie, della classe base. Queste sottoclassi cambiaranno la struttura del contenuto del JFrame, ossia il Content??
    Alt, detto così è un po' vago e comunque dipende tutto da come lo si fa. Ma ti ripeto quello che dicevo prima. Se fai una classe "base" FinestraBase che estende JFrame e poi la estendi in due classi FinestraA e FinestraB, quando istanzi queste hai 2 frame. NON stai cambiando il contenuto di un frame ... ne stai creando due distinti!
  • Re: Interfaccia grafica

    Si ok fino qui ok..
    Effettivamente è cosi, l'ho scoperto prorprio dopo che me l'hai detto.
    Ma a conti fatti, dovrei in via teorica adottare quel tipo di soluzione.
    L'hai detto anche tu:
    Semmai sarebbe più sensato avere una unica finestra in cui all'interno "scambi" pannelli mostrandone uno solo per volta. E ci sono diverse tecniche per farlo.
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Ma a conti fatti, dovrei in via teorica adottare quel tipo di soluzione.
    Ma sicuramente NON a livello di frame.

    L'esempio che ho fatto io poco fa non è sbagliato o insensato. Ha perfettamente senso se ad esempio dovessi creare due finestre distinte ma che hanno "qualcosa" in comune, che potrebbe essere della logica o magari una parte della interfaccia grafica.
    Ma tutto questo non c'entra con lo "scambiare" il contenuto.
  • Re: Interfaccia grafica

    Ok...
    grazie
  • Re: Interfaccia grafica

    Ciao ragazzi vorrei capire bene cosa significa quest'istruzione
    
    this.getContentPane().setBackground(Color.ORANGE);
    
    L'oggetto chiamante è la classe stessa.
    chiama il metodo get che eredita da Component
    ma il metodo set in questione è chiamato da JFrame
    che anche lui eredita Component.
    Quindi
    getDiComponent.setDiJFrame
    non riesco a capirlo, perchè sul metodo get, non gli passo set come attributo
    Non ricordo più cosa vuol dire il punto il simbolo punto, mi ricordo che mi fa accedere in java ai metodi di classe, in c alle variabili di una struct
    Panico!!!
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Ciao ragazzi vorrei capire bene cosa significa quest'istruzione
    
    this.getContentPane().setBackground(Color.ORANGE);
    
    getContentPane() è un metodo definito in JFrame e serve per ottenere il componente che fa da "content pane" nel frame. Materialmente il content pane predefinito è un banalissimo JPanel. Solo che getContentPane() restituisce l'oggetto come tipo più generalizzato java.awt.Container. Container è-un Component ed ha quindi il setBackground(Color)

    Se ti sembra "strana" la forma con metodi uno dietro l'altro così, questa tecnica si chiama "method chaining". Ogni metodo successivo è invocato sull'oggetto restituito dal metodo invocato appena prima.

    Anche es.
    String s = "-A-B-C";
    String[] arr = s.substring(1).toLowerCase().split("-");
    P.S. se vuoi vedere un altro esempio di method chaining, l'ho appena scritto poco fa qui
  • Re: Interfaccia grafica

    Ciao...
    dopo un abbondante pausa, mi sono rimesso a scrivere javaCode.
    Come potrei far girare un app, su un unico JFrame, che ovviamente cambia layout, bottoni ecc, in base al JButton che viene cliccato sul Frame Principale.
    Ho pensato richiamare, il nuovo "setGrafico" con ustinza.
    L'istanza viene richiamata in questo modo
    
    public void actionPerformet (event e){
          if(e.getCommand() == "JButton1"){
                 NuovoSetGrafico nuovo = new NuovoSetGrafico();
                 this.dipose
                 nuovo.setVisibile(true);
          }
    }
    
    Il fatto è che il realtà viene cmq istanziata una nuova finestra, io vorrei se possibile, gestire il tutto da quell'unica finestra...
    Non so se mi spiego bene, ma vorrei fare una sorta di refresch, più che istanziare un nuovo Frame

    Ho pensato che potrei creare un interface, per avere una serie di comportamenti che facciano quello vorrei.
    Un solo JFrame che mostra in output il nuovo setGrafico, in base al JButton che clicchi
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Il fatto è che il realtà viene cmq istanziata una nuova finestra, io vorrei se possibile, gestire il tutto da quell'unica finestra...
    Non so se mi spiego bene, ma vorrei fare una sorta di refresch, più che istanziare un nuovo Frame

    Ho pensato che potrei creare un interface, per avere una serie di comportamenti che facciano quello vorrei.
    Un solo JFrame che mostra in output il nuovo setGrafico, in base al JButton che clicchi
    Non c'entrano le interface Java. Lo "scambio" di pannelli o in generale di componenti non ha nulla direttamente a che fare con la OOP.
  • Re: Interfaccia grafica

    Non saprei come fare...
    Un altra soluzione possibile sarebbe utilizzare dei metod "set", che mi cambiano il setGrafico direttamente con action Performed, ma il codice non sarebbe proprio da OOP.
    Cioè mi diventa un minestrone...
    Però oltretutto il mio oggetto JFrame sarebbe praticamente uno solo, ma con tanti comportamenti...ma non so se è proprio giusto, e poi come fare a ripulire il JFrame?? Dovrei cancellare un "JPanel e riscriverne un altro"..
    Non so neanche se un Jpanel si può cancellare..
    Bene,,,
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Non saprei come fare...
    Ce ne sono svariate di tecniche per "scambiare" componenti .... il punto è che non le hai ancora viste/affrontate. E ti ripeto che tutto questo, di per sé, non ha nulla a che fare direttamente con la OOP.
Devi accedere o registrarti per scrivere nel forum
50 risposte