Luca Padovani
lpadovan@cs.unibo.it
Nella seconda parte del progetto si richiede la realizzazione di una calcolatrice grafica che utilizzi i componenti sviluppati nella prima parte del progetto.
Gli studenti sono liberi di adottare l'ambiente di sviluppo che preferiscono. Tuttavia, non è possibile fare uso di librerie di classi esterne a quelle fornite da Java (versioni 1.3.1 e successive), e l'intero progetto deve essere compilabile ed eseguibile anche utilzzando i comandi javac e java visti a lezione. Allo stesso tempo, essendo lo scopo del progetto quello di creare una gerarchia di componenti grafici, non è ammesso l'uso dei componenti grafici forniti nella libreria di Java, ad eccezione di JFrame e JPanel usati per creare la finestra principale dell'applicazione e l'area su cui i componenti sviluppati devono essere disegnati.
La valutazione del progetto riguarderà l'architettura interna delle classi, con particolare enfasi sugli aspetti di object-orientation (incapsulamento, uso corretto dell'ereditarietà e del meccanismo di late-binding) e di pulizia del codice, l'effettiva implementazione delle funzionalità richieste nelle due parti del progetto, ed infine, seppur in misura molto minore e solo se i requisiti minimali del progetto sono stati soddisfatti, eventuali estensioni alla libreria di componenti e/o all'applicazione che gli studenti decideranno di apportare.
Si richiede l'implementazione di un insieme minimo di componenti grafici. Tale insieme è costituito da:
Quelli elencati sono componenti foglia, nel senso di componenti che non contengono al loro interno altri componenti. Occorre però almeno un altro tipo di componente, detto componente contenitore, che non ha necessariamente un aspetto ``visivo'', ma serve ad organizzare geometricamente e gestire sotto-componenti.
Deve infine esistere una finestra che rappresenta la radice dell'albero dei componenti che realizzano l'interfaccia grafica. La Figura 1 rappresenta le gerarchie di interfacce e le classi astratte da implementare.
Si ricorda che la gerarchia delle interfacce non implica l'implementazione di una gerarchia isomorfa di classi. Se lo si ritene opportuno, è possibile raffinare ed estendere la gerarchia di classi sviluppate, sempre che questa implementi (nel senso di implements di Java) la gerarchia di interfacce della figura.
Una GUI (Graphical User Interface) è rappresentata in memoria come un albero di oggetti. Le foglie dell'albero sono costituite da componenti foglia, mentre i nodi interni dell'albero sono componenti contenitori. La radice dell'albero deve essere un componente finestra, cioè un oggetto la cui classe implementa l'interfaccia IWindow.
Nota: non si confondano gli alberi di Figura 1 con l'albero di oggetti che rappresenta la GUI. Gli alberi della figura mostrano le relazioni tra le interfacce da implementare. L'albero di oggetti della GUI è un insieme di oggetti, ciascuno dei quali è l'istanza di una classe che implementa una delle interfacce di Figura 1 tra quelle con radice IComponent.
L'istanziazione dei componenti dell'interfaccia deve essere affidata ad una opportuna estensione della classe astratta ComponentFactory della figura. Supponendo che MyComponentFactory sia il nome di tale classe, deve essere possibile istanziarla invocando il costrutture di default (quello senza argomenti). Ovvero, la creazione dei componenti dell'interfaccia dovrà essere effettutata secondo lo schema seguente:
[fontsize=\small] // Creo la factory dei componenti ComponentFactory factory = new MyComponentFactory(); // Chiedo alla factory di istanziare // i componenti desiderati IButton button1 = factory.createButton(...); IContainer container = factory.createContainer(...); // ... altri componenti ...
La visualizzazione di un componente è affidata al metodo paint. Nel momento in cui tale metodo viene invocato su un componente, il componente deve disegnarsi utilizzanto i metodi messi a disposizione dall'oggetto Graphics passato come parametro di paint ed eventualmente, se il componente è un componente contenitore, invocare il metodo paint su tutti i sotto-componenti, dopo aver aggiornato opportunamente lo stato dell'oggetto Graphics.1
Il processo di visualizzazione deve essere implementato in modo top-down. Ovvero, un componente contenitore che ``disegna qualcosa'' sulla finestra di visualizzazione deve farlo prima di invocare il metodo paint sui propri sotto-componenti.
Gli eventi permettono di rendere l'interfaccia grafica interattiva. Per gli scopi del progetto distingueremo due tipi diversi di eventi:
La ``finestra'', alla radice dell'albero, deve intercettare gli eventi AWT di Java, produrre (istanziare) oggetti corrispondenti ai tipi di eventi che siamo interessati a considerare, ed inoltrare la richiesta di gestione al componente opportuno. L'inoltro può essere fatto in due modi, in base al tipo di evento: l'evento tastiera deve essere inoltrato ai componenti di tipo IText presenti nell'albero GUI. L'evento corrispondente alla pressione di un bottone del mouse deve invece essere inoltrato al componente che si trova correntemente sotto il puntatore del mouse.
In questa parte del progetto si richiede l'implementazione di una semplice applicazione, una calcolatrice, che utilizzi la libreria di classi definita ed implementata nella prima parte del progetto. Per quanto riguarda l'aspetto grafico di tale applicazione, gli studenti possono prendere spunto dalle applicazioni xcalc e gcalc normalmente presenti su ogni sistema Linux, ma hanno sostanzialmente completa libertà sulla disposizione dei componenti grafici.
L'insieme minimale di operazioni che la calcolatrice deve supportare include: le 4 operazioni aritmetiche di base (addizione, sottrazione, moltiplicazione, divisione), una operazione per azzerare la calcolatrice, tre funzioni trigonometriche (seno, coseno, tangente). Deve essere possibile inserire costanti numeriche intere con opzionalmente una parte decimale. Sarà dunque necessario predisporre un opportuno bottone ``.'', oltre a quelli per le cifre decimali e le operazioni richieste. Il bottone ``='' deve consentire la valutazione dell'espressione inserita.
Oltre all'uso dell'interfaccia grafica, deve essere possibile inserire le cifre decimali anche premendo sulla tastiera i tasti corrispondenti (da 0 a 9). Infine, il tasto `c' deve consentire di azzerare la calcolatrice, ed il tasto 'q' deve terminare l'applicazione.
This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 0 progetto.tex
The translation was initiated by Luca Padovani on 2003-05-22