SCRITTO DI GIUGNO ... ERRORI PIU' FREQUENTI "FREQUENTLY MADE MISTAKES" NOTE: Non dire tutto quello che era richiesto e' un errore. Dire le cose in modo incomprensibile e' un errore. Gli errori elencati qui sono invece errori del tipo "dire cose diverse da quelle giuste". ***** PARTE TEORICA ***** NOTA: Le dispense sono su web alla pagina http://www.disi.unige.it/person/MagilloP/INTERF04/lez_iu.html **ES 1** TESTO: Fare due esempi di tipi di componenti (o dispositivi) di interfaccia spiegando le caratteristiche di aspetto e di sensibilita' ad eventi che li contraddistinguono. Per ciascun tipo di dispositivo considerato, fare un esempio di interfaccia che contiene un dispositivo di quel tipo, spiegando lo scopo per cui viene usato. SOLUZIONE: Vedere dispense su "Dispositivi di controllo"; come introduzione vedere anche dispense su "Struttura e funzionamento di un'interfaccia". ERRORI: --Qui dipende dagli esempi che si sono presi... --Bisognava citare due tipi di dispositivi particolari (es. bottoni, slider, campi di testo,...), NON va bene citare, come due tipi, i componenti attivi e i componenti inerti (queste sono due grosse categorie di componenti, non due tipi, e le domande non avrebbero senso poiche' non tutti i componenti attivi/inerti hanno stesse caratteristiche di aspetto o sensibilita' a eventi). **ES 2** TESTO: Che cosa e' un evento? Quali sono le azioni piu' comuni che generano eventi? Che cosa si intende per programmazione guidata da eventi? Che cosa si intende per interazione bloccante e non bloccante? SOLUZIONE: Vedere dispense su "Struttura e funzionamento di un'interfaccia". ERRORI: --Un evento NON e' un'azione e NON e' una reazione. --La definizione di programmazione NON e' quella che usa le callback, non e' quello il punto chiave. Molti hanno scritto cose vaghe o particolari senza cogliere il punto chiave. --Confondere interazione bloccante/non bloccante con dialoghi modali/non modali oppure con interazione sincrona/asincrona. **ES 3** TESTO: Che cosa e' il frame buffer? A che cosa serve? Che cosa contiene? Che cosa e' la profondita' del frame buffer? Maggiore o minore profondita' che effetto hanno sull'immagine? Che cosa e' la risoluzione del frame buffer? Maggiore o minore risoluzione che effetto hanno sull'immagine? SOLUZIONE: Vedere dispense su "Introduzione alla Computer Graphics". ERRORI: --Il frame buffer NON serve per ridisegnare la finestra quando questa viene iconificata e poi deiconificata oppure coperta da un'altra e poi scoperta. --La profondita' NON serve per tenere la distanza dal punto di vista (quello e' il depth buffer). NON e' stato contato se uno ha parlato del depth buffer o del double buffer. Era sufficiente parlare del color buffer. **ES 4** TESTO: Che cosa sono le coordinate omogenee, come sono definite? Che relazione c'e' tra le coordinate omogenee e le coordinate cartesiane di un punto P? Quali sono i vantaggi dell'uso di coordinate omogenee invece di quelle cartesiane? SOLUZIONE: Vedere dispense su "Introduzione alla Computer Graphics". ERRORI: --BISOGNA dire che deve essere w<>0. --NON SEMPRE w=1 (quella e' la forma canonica). --La relazione e' espressa dalla formula di conversione x cartesiana = x omogenea / w, e analogo per y e z. --Consentono di esprimere in forma matriciale NON le coordinate dei punti bensi' le trasformazioni di coordinate ***** PARTE PRATICA ***** TESTO: Consideriamo un'interfaccia che consiste in una finestra top-level con --un pannello di lavoro --tre bottoni di UGUAL misura allineati orizzontalmente sopra il pannello ed etichettati Red, Green, Blue. Si veda la figura: +--------------------------------+ | Red | Green | Blue | +----------+----------+----------+ | | | | | | | | | | | | | | | | | | | | | | | | | | +----------+----------+----------+ L'applicazione ha nel suo stato interno un colore corrente C appartenente all'insieme {Red, Green, Blue} e un numero intero S inizialmente = 0. **ES 1** TESTO: Quale gerarchia di annidamento e quali layout manager si possono usare per ottenere questa configurazione? Disegnare l'albero che descrive la gerarchia. SOLUZIONE: Il contenitore top-level ha un border layout. Al centro ci sta il pannello di lavoro. A nord ci sta un altro pannello con grid layout (1 riga e 3 colonne) con dentro i tre bottoni. La figura deve mostrare l'albero di contenimento: top-level (border layout) | +----------+----------+ (posiz.centro)| |(posiz.nord) | | pannello di lavoro pannello aux (grid layout) | | | i tre bottoni red green blue --Il contenitore NON e' il suo layout manager (sbagliato dire "a nord ci sta un grid layout...") --Per il pannello bottoni flow layout non va bene e border layout nemmeno (non vengono di uguale misura) --Per il top level grid layout non va beme (il pannello di lavoro e quello coi 3 bottoni vengono grandi uguali) **ES 2** TESTO: Scrivere lo PSEUDO CODICE del corpo delle callback associate ai tre bottoni in modo tale che: --ciascun bottone assegni come colore corrente C quello scritto sulla sua etichetta --quando il colore corrente e' C, l'utente possa azionare solo i bottoni corrispondenti ai due colori diversi da C, non il bottone corrispondente a C SOLUZIONE: Per esempio la callback del bottone red (le altre due analoghe): --assegna C = red --disabilita bottone red --abilita gli altri due bottoni (solo uno era abilitato ma non importa) Oppure (piu' fine, va a vedere quale bottone va riabilitato): --se (C==green) abilita bottone green --altrimenti se (C==blue) abilita bottone blue --assegna C = red --disabilita bottone red Esistono altri modi di fare la stessa cosa... ERRORI: --NON aver gestito le abilitazioni/disabilitazioni --Aver solo disabilitato il bottone premuto senza riabilitare mai gli altri bottoni --Qualcuno ha messo in piedi strani meccanismi con variabili per capire quale bottone e' stato premuto l'ultima volta... quando basta guardare il colore corrente... --SE di un bottone scatta la callback questo IMPLICA che tale bottone ERA ABILITATO! **ES 3** TESTO: Scrivere in PSEUDO CODICE il corpo della funzione di ridisegnamento (in Java paint o paintComponent) associata al pannello in modo tale che --sia disegnata un'ellisse centrata nel pannello, con diametro orizzontale pari DX-S e diametro verticale pari a DY-S, dove DX e DY sono la larghezza e l'altezza correnti del pannello --l'ellisse sia colorata con il colore corrente C dell'applicazione Cambia qualcosa nelle callback dei bottoni Red, Green, Blue scritte per rispondere all'esercizio 1? SOLUZIONE: --DX = leggi larghezza corrente del pannello --DY = leggi altezza corrente del pannello --imposta colore C --disegna ellisse iscritta nel rettangolo di angolo (S/2,S/2), larghezza DX-S e altezza DY-S Nelle callback alla fine bisogna aggiungere chiamata alla funzione di ridisegno (repaint) del pannello di lavoro. NOTA: --se uno ha usato alti parametri per l'ellisse (es. centro al posto dell'angolo) va bene. --NON ho contato se uno ha fatto sbagliato i calcoli geometrici. ERRORI: --NON si puo' scrivere UNA sola istruzione per disegnare ellisse colorato --Si imposta il colore prima e si disegna dopo, NON viceversa --Colore e' parametro di stato del sistema grafico, non proprieta' dell'ellisse **ES 4** TESTO: Fare in modo che --ogni volta che l'ellisse cambia colore, il valore di S aumenti di 10 pixel (in pratica l'ellisse si restringe); l'ellisse resti centrata nel pannello --non appena uno dei due diametri dell'ellisse diventa minore o uguale a zero, l'applicazione termini SOLUZIONE: --Nelle callback prima della chiamata a repaint aggiungere: S = S+10 --Aggiungere il controllo: if ((S>=DX) OR (S>+DY)) then TERMINA, questo controllo va messo nella funzione di disegno del pannello prima di disegnare l'ellisse NOTA: E' stato dato per buono anche mettere il controllo nelle callback dopo aver incrementato S, anche se in realta' questo porta un problema: se l'utente manipolando la finestra la restringe t.c. S diventi >= di una delle dimensioni, l'interfaccia non se ne accorge (mettendo il controllo nella funzione di disegno invece se ne accorge). ERRORI: --NON dire DOVE vanno messi gli spezzoni di codice nuovi. --S NON va incrementato nella funzione di disegno del pannello (altrimenti incrementa anche in altri casi per es. dopo che ci ho passato sopra un'altra finestra). --Qualcuno ha messo in piedi meccanismi complicati per capire, nella funzione di disegno se il colore dall'ultima volta e' cambiato e solo in quel caso incrementare S: se funziona e' stato dato per buono.