DIPARTIMENTO   DI   INFORMATICA
Università di Torino

Programmazione in Java - CEDACRI

a.a. 00/01

Lezione 9

Argomenti trattati

Interfaccie Utente Grafiche (GUI) e Programmazione Guidata dagli Eventi.

La gerarchia delle classi AWT/Swing.

(ATTENZIONE: Un overview molto chiaro e sintetico di questi argomenti e' presentato nei paragrafi 10.1, 10.2, e 10.3 del testo rifermento. Il resto del capitolo 10 presenta alcuni concetti in modo chiaro, senza enumerare tutti i dettagli di AWT/Swing. Una trattazione dettagliata, e piu' faticosa da leggere, si trova nei Capitoli 8 e 9 del libro "Java 2 i fondamenti".)

Programmi utilizzati

  • dal Cap. 10 (ATTENZIONE: alcuni degli esempi ilustrati in questo capitolo hanno il pregio di essere molto semplici, essi usano il metodo paint per disegnare direttamente su un frame. Questo stile di programmazione e' SCONSIGLIATO. Altri esempi usano lo stile CONSIGLIATO, pero', per ridisegnare le componenti grafiche poste su di frame usano il metodo paint invece del metodo paintComponent. Per ulteriori dettagli consultare il Capitolo 7 del libro "Java 2 i fondamenti".)
      1. Etichette e bottoni
        1. Una classe che rappresenta un frame con una etichetta e un bottone Frame1.java e una semplice applicazione che la usa: Example1.java
          ESERCIZI:
          1. Verificare cosa succede aggiungendo il metodo paint, come descitto nel paragrafo 10.4
          2. Recuperate un'mmagine .gif o .jpg dal WEB, e usatela come descritto nel paragrafo 10.4
          3. Fare gli esercizi alla fine del paragrafo 10.4
        2. Gestione di un evento: tre diversi approcci standard
        3. Consideriamo il problema di progettare, seguendo l'architettura MVC, un applicazione che mostra quante volte e' stato premuto un bottone. La classe che realizza il Model Counter.java e la stessa per tutti e tre gli approcci.

          1. Una sola classe che realizza View e Controller
            Frame2a.java
            e una semplice classe di start-up: Example2a.java
          2. Una interfaccia
            UpdatableView.java,
            una classe per la View che la implementa
            Frame2b.java,
            una classe per il Controller
            CountController.java,
            e una semplice classe di start-up: Example2a.java
          3. Una classe che estende JButton e realizza il Controller
            CountButton.java,
            una classe che realizza la View
            Frame2c.java
            e una semplice classe di start-up: Example2c.java

        Questa terza soluzione e' la piu' semplice. Osserviamo il suo "Class Diagram":

        Architecture of Example2c 
        (NOTA: le parti relative alle interfacce dovrebbero essere in ITALICO,
        ma qui non lo sono)
        
             ActionListener <- - - - - -  AWT/Swing classes that detect events
               actionPerformed(ActionEvent e)
                       _^_
                        |
            
                        |
        JButton <|--- CountButton ---------------------> Counter
                       actionPerformed(ActionEvent e)     increment()
                        |                                 countOf()
                                                            ^
                        |                                   |
                        v                                   |
                      UpdateableView <|- - - - - - - - - Frame2c ---|> JFrame
                           update()                       update()

        Consideriamo il problema di modificare l'applicazione aggiungendo un bottone che, quando premuto, causa la terminazione dell'applicazione.

        E' possibile realizzare questa applicazione partendo dalla terza realizzazione dell'applicazione originaria e AGGIUNGENDO NUOVE CLASSI, ma LASCIANDO INALTERATE LE CLASSI ORIGINARIE.

        Consideriamo: una classe che estende JButton e realizza il Controller per il nuovo bottone (NOTA: questa classe NON rimpiazza la precedente: nell'appicazione ci saranno DUE Controller, corrispondenti ai DUE bottoni)
        ExitButton.java,
        una classe che ESTENDE la nuova Wiew e realizza la nuova View
        Frame3.java
        e una semplice classe di start-up (completamente nuova):
        Example3.java

        Se poi vogliamo "abbellire" l'applicazione, permettendo la terminazione con un clic sulla "X" che si trova in alto a destra della finestra, e sufficiente aggiungere la classe (che realizza un TERZO controller)
        ExitController.java
        e aggiungere nel costruttore della classe Frame3 la riga di codice

        addWindowListener(new ExitController());


        ESERCIZI: Fare gli esecizi alla fine del paragrafo 10.5

      2. Panel e Border
        1. Una classe che rappresenta un frame con border layout e panel
          Frame4.java
          una classe che rappresenta un panel che mostra un disegno
          Drawing.java
          e una semplice applicazione che le usa:
          Example4.java
        2. Vediamo ora un'applicazione che mostra una semplice animazione.
          L'archittetura è la seguente:
          
                            ThrobFrame
                               |
                               v
          ColorButton ----> ThrobPanel <---- ThrobController
                               |               |
                               v               |
                            ThrobbingBall <----+
          
          
          
          La classe che realizza il "Model" è:
          ThrobbingBall.java
          le classi che realizzano la "View" sono:
          ThrobPanel.java (che disegna la palla su un panel) e
          ThrobFrame.java (che disegna il panel e un bottone per cambiare colore su di un frame).
          Il "Controller" è realizzato dalle classi:
          ThrobController.java (il cui metodo run realizza l'animazione) e
          ColorButton.java (che cambia iol colore della palla ogni volta che il bottone viene premuto).
          La componente di startup è realizzata da:
          StartThrob.java
      3. Grid Layout
      4. Scrolling List
      5. Text Field
      6. Segnalazione degli errori con i Dialog
      7. Text Area e Menu
      8. Uso degli Observers
      9. "BEYOND THE BASICS"
        1. Applet
        2. (ATTENZIONE: Una trattazione dettagliata dell'argomento si trova nel Capitolo 10 del libro "Java 2 i fondamenti".)

        3. Thread
          1. Modifichiamo l'applicazione precedente in modo da mostrare due animazioni simultaneamente.

            La prima modifica consiste nell'aggiungere

            implements Runnable
            
            all'header della classe ThrobController.
            La nuova classe che mostra il frame è:
            Throb2Frame.java (che disegna due panel).
            La nuova componente di startup è realizzata da:
            StartThrobs.java
          2. Consideriamo ora un'applicazione che simula due venditori di biglietti. Uno dei venditori è tre volte più veloce dell'altro. Ogni venditore è modellato da un oggetto con un proprio thread di esecuzione; questi oggetti condividono l'oggetto che modella i biglietti.

            La classe che modella i biglietti è:
            Tickets.java.
            La classe che modella i venditori è:
            SalesAgent.java.
            La componente di startup è realizzata da:
            StartTicketSales.java

          (ATTENZIONE: Una trattazione dettagliata dell'argomento si trova nel Capitolo 1 del libro "Java 2 tecniche avanzate".)



[Ferruccio Damiani - DIDATTICA] [Corsi di Studi in Informatica]

Last update: Oct 22, 2000