La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Introduzione a JFC/Swing Progetto di Basi di Dati 2007/2008 Domenico Lembo, Luigi Dragone, Marzo Ruzzi e Daniele Calisi Queste slide saranno online:

Presentazioni simili


Presentazione sul tema: "Introduzione a JFC/Swing Progetto di Basi di Dati 2007/2008 Domenico Lembo, Luigi Dragone, Marzo Ruzzi e Daniele Calisi Queste slide saranno online:"— Transcript della presentazione:

1 Introduzione a JFC/Swing Progetto di Basi di Dati 2007/2008 Domenico Lembo, Luigi Dragone, Marzo Ruzzi e Daniele Calisi Queste slide saranno online: (teaching)

2 Sommario Introduzione al modello a componenti JavaBeans Modello JavaBeans Eventi e listener Elementi di base della libreria JFC/Swing Esempi di componenti Struttura di un'applicazione Esempi

3 Modello JavaBeans (1) La libreria JFC/Swing è organizzata in base al modello JavaBeans Un componente è un particolare tipo di dato (classe/istanza) caratterizzato da un insieme di proprietà, che comunica con gli altri componenti attraverso il meccanismo degli eventi. Un evento è un oggetto che descrive il verificarsi di una particolare situazione: viene generato da un componente ed elaborato da altri

4 Modello JavaBeans: esempio window1 (component) - width (property) - height (property) window1 (component) - width (property) - height (property) imageInWindow1 (component) - width (property) - height (property) - image (property) imageInWindow1 (component) - width (property) - height (property) - image (property) resizeEvent (event)

5 Modello JavaBeans (2) Esistono componenti in grado di contenerne degli altri. Il ciclo di vita di un componente è generalmente strettamente contenuto in quello del suo contenitore (esempio: finestra, widget interni) Le proprietà di un componente ne descrivono lo stato, a differenza delle variabili membro, possono essere di sola lettura, di sola scrittura o di lettura/scrittura

6 Modello JavaBeans (3) In Java, un componente è denominato bean ed è caratterizzato da: Un costruttore pubblico, possibilmente senza argomenti Metodi pubblici per impostare il valore delle proprietà (setter) Metodi pubblici per consultare il valore delle proprietà (getter) Eventualmente metodi pubblici per eseguire particolari compiti (verb) Le proprietà sono gestite da variabili private del componente I metodi di impostazione possono implementare logiche di validazione dei dati

7 Modello JavaBeans: esempio di codice public class MyBean { private String v1; private int v2; public MyBean(String v1) { this.v1 = v1; v2 = 0 } public String getV1() { return v1; } public void setV2(int v2) { this.v2 = v2; } public int getV2() { return v2; } }

8 Eventi e ascoltatori (1) Un componente è in grado di produrre eventi di qualche natura es.: il valore di qualche proprietà è stato modificato Permette agli altri componenti di registrarsi come ascoltatori (listener) agli eventi in questione Quando si verifica la situazione associata all'evento, il produttore dell'evento lo notifica (firing) a tutti gli ascoltatori che si sono registrati per quell'evento (meccanismo di callback).

9 Eventi e ascoltatori (2) In Java un listener è un oggetto che implementa una specifica interfaccia, generalmente con dei metodi di callback che hanno come argomento l'oggetto di tipo evento a cui devono rispondere. L'oggetto di tipo evento porta con sé informazioni sull'evento stesso: L'origine dell'evento, ovvero l'oggetto che l'ha generato Lo stato dell'evento (se è già stato consumato, se è valido, ecc.) Le caratteristiche specifiche dell'evento (dipendenti dalla tipologia)

10 Eventi e ascoltatori: esempio window1 (component) - width (property) - height (property) window1 (component) - width (property) - height (property) imageInWindow1 (component) - width (property) - height (property) - image (property) imageInWindow1 (component) - width (property) - height (property) - image (property) resizeEventListener (listener) - process(ResizeEvent) (callback) resizeEventListener (listener) - process(ResizeEvent) (callback) resizeEvent (event) - source (property) - newSize (property) resizeEvent (event) - source (property) - newSize (property) firing

11 Eventi e ascoltatori: esempio window1 (component) - width (property) - height (property) window1 (component) - width (property) - height (property) imageInWindow1 (component + listener) - width (property) - height (property) - image (property) - process(ResizeEvent) (callback) imageInWindow1 (component + listener) - width (property) - height (property) - image (property) - process(ResizeEvent) (callback) resizeEvent (event) - source (property) - newSize (property) resizeEvent (event) - source (property) - newSize (property) firing

12 Pattern observer Observer: due componenti: Modello: mantiene la struttura dati e consente (agli altri componenti) di manipolare il contenuto Vista: visualizza (ad es.: in una finestra) tale struttura dati Per evitare inutili aggiornamenti, il componente vista si registra come ascoltatore degli eventi di modifica del modello e aggiorna la vista solo in risposta a tali eventi Disaccoppiamento tra struttura dati e visualizzazione (possono esistere molteplici visualizzazioni della stessa struttura dati)

13 Eventi e ascoltatori: esempi di codice (1) Un evento (ad es., EventX) è denito mediante unopportuna classe associata allinterfaccia con il metodo di callback: public class EventX { public Object getSource() {... }... } interface EventXListener { public void process(EventX e); }

14 Eventi e ascoltatori: esempi di codice (2) Un componente che puo sollevare tale tipo di evento espone dei metodi per il controllo dei listener ed il ring dello stesso: class Component { public void addEventXListener(EventXListener l) {... } public void removeEventXListener(EventXListener l) {... } void fireEventX(EventX e) {... } }

15 Eventi e ascoltatori: esempi di codice (3) Supponendo che il componente mantenga in una collezione listener lelenco dei listener registrati, una possibile implementazione del metodo di ring è: void fireEventX(EventX e) { for(Iterator iter = listeners.iterator(); iter.hasNext(); ) { ((EventXListener)iter.next()).process(e); }

16 Eventi e ascoltatori: esempi di codice (4) Un listener e un oggetto di una classe implementante una specica interfaccia che viene registrato presso il componente di cui si intende processare gli eventi. class MyListener implements EventXListener { public void process(EventX e) {... } }... Component c = new Component(); EventXListener l = newMyListener(); c.addEventXListener(l);

17 Eventi e ascoltatori: esempi di codice (5) Per comodità di scrittura, i listener vengono generalmente implementati con classi anonime definite all'interno del codice. Esempio: BaseType b = new BaseType() { public void processEventX(EventX e) { … } }); myContainer.addXListener(new BaseType() { public void processEventX(EventX e) { //... } });

18 Componenti visuali Il modello a componenti e stato proposto in diversi scenari applicativi, tuttavia si presta particolarmente bene alla progettazione ed implementazione di GUI. Il modello dei JavaBeans e stato denito inizialmente per loriginaria libreria Java per lo sviluppo di GUI, denominata AWT, ma si è poi evoluto in modo indipendente (ad es., gli Enterprise JavaBeans sono componenti non visuali che incapsulano funzioni e dati in applicazioni distribuite).

19 Componenti in JFC/Swing (1) Un insieme di componenti che realizzano controlli (control) visuali (es.: etichette, campi di testo, liste di selezione, ecc.) Un insieme di eventi (event) significativi per l'interazione con l'utente (es.: spostamento del mouse, pressione di un tasto, cambiamento di stato di un oggetto, ecc.) Un insieme di componenti che realizzano oggetti di tipo contenitore (container) che aggregano visivamente e funzionalmente altri componenti

20 Componenti in JFC/Swing (2) Un insieme di moduli che gestiscono strategie di impaginazione dei componenti all'interno dei contenitori (layout manager), di formattazione visuale (border renderer, formatter, ecc.) e di colloquio (standard dialog: avvisi, apertura/salvataggio file, ecc.) Un insieme di tipi di dato di base (listener e data model) da estendere opportunatamente per implementare il comportamento desiderato

21 Event dispatcher thread La libreria JFC/Swing denisce ed implementa, inoltre, un opportuno event dispatch thread che intercetta gli eventi e li smista ai moduli interessati dal processamento La logica applicativa viene eseguita, quindi, allinterno del thread del dispatcher che non e il thread principale dellapplicazione Le applicazioni che usano JFC/Swing sono sempre multi- threaded Le operazioni svolte dai listener devono essere di breve durata, per non bloccare il thread di gestione degli eventi ovvero lintera GUI (congelamento); Eventuali operazioni di lunga durata vanno eseguite in un thread separato, il listener si limita allinizializzazione ed avvio dello stesso.

22 I controlli di JFC/Swing I controlli disponibili JFC/Swing e sono caratterizzati: Da un insieme di proprietà Dall'aspetto visivo Dal tipo di interazione e di eventi che possono essere generati

23 Eventi di interfaccia e semantici Gli eventi possono essere: di interfaccia, ovvero operazioni di basso livello (es.: pressione di un tasto, trascinamento, click del mouse, ecc.) applicativi/semantici, ovvero associati a una o più combinazioni di eventi di interfaccia e denotano operazioni di alto livello (avvio di un'operazione, modifica di un valore, ecc.) La distinzione può aumentare la modularità e quindi la portabilità

24 Esempio di controllo Controllo JButton Permette di implementare pulsanti che l'utente può premere La proprietà di base del controllo e il testo visualizzato (text); Laspetto visivo è un rettangolo che visualizza tale testo Levento applicativo associato alla scelta da parte dellutente è actionEvent.

25 Look&Feel (1) La visualizzazione può essere adattata in modo trasparente all'applicazione In JFC/Swing è prevista una funzionalità per specificare in maniera indipendente: Il look: specifiche di visualizzazione Il feel: specifiche di interazione

26 Look&Feel (2)

27 Altri esempi di controlli Swing Le etichette (label) realizzate dalla classe JLabel, permettono di specicare un testo da visualizzare, generalmente utilizzato per descrivere un altro controllo; I campo di testo implementati dalle classe JTextField e JTextArea, per specicare unarea in cui lutente può inserire/modicare valori espressi come testo (formattato o meno, ad es., numeri); Le check-box implementate dalla classe JCheckBox, per gestire opzioni di tipo booleano; I radio-button implementati dalle classi JRadioButton e ButtonGroup, per gestire opzioni a scelta multipla esclusiva Le liste di selezione, implementate da diverse classi (JListBox, JComboBox, ecc.) per la scelta (eventualmente multipla) di opzioni da elenchi generici

28 Esempi di controlli Swing Un elenco visuale di tutti i controlli Swing si trova a questa URL:

29 Contenitori (1) Contenitori di primo livello (top-level container) Contenitori che non sono contenuti in altri contenitori, in genere sono finestre o finestre di dialogo (window, dialog box)

30 Contenitori (2) Contenitori di livello intermedio (intermediate container) Contenitori che sono contenuti all'interno di altri contenitori

31 Struttura di un'applicazione con Swing (1) Sebbene possibile, in genere le applicazioni non deniscono dei propri controlli visuali, ma si appoggiano a quelli della libreria. Al contrario è prassi corrente denire dei contenitori specici per lapplicazione. La specializzazione è guidata dalla speciche funzionali dellapplicazione. Ad es., se è richiesta la visualizzazione di un certo insieme di dati in una nestra si denirà una sotto- classe del container specializzata per la visualizzazione di tali dati.

32 Struttura di un'applicazione con Swing (2) I passi sono i seguenti: si denisce una classe che estende la classe del contenitore della libreria (ad es., JFrame se si tratta di una nestra, JPanel se e un semplice pannello); per ogni elemento contenuto allinterno del contenitore si denisce una variabile membro privata della classe del tipo opportuno; si deniscono uno o piu metodi che inizializzano i vari elementi; si denisce un metodo che inizializza loggetto in questione; si associano le operazioni di inizializzazione al costruttore della classe.

33 Struttura di un'applicazione con Swing (3) La procedura di inizializzazione di ogni controllo si articola nei seguenti passi: istanziazione delloggetto; impostazione delle proprieta delloggetto; registrazione di eventuali event listener; aggiunta delloggetto al contenitore. Alcuni contenitori, in particolare i pannelli, che sono in genere inclusi allinterno di nestre o dialog box, richiedono che in fase di inizializzazione sia specicata la politica di posizionamento degli oggetti contenuti (layout).

34 Applicazione minimale (1) In linea di massima unapplicazione JFC/Swing minimale è strutturata nel seguente modo: un insieme di tipi dato ottenuti mediante estensione delle classi dei container che deniscono la struttura delle nestre/maschere dellapplicazione un insieme di tipi dato ottenuti mediante limplementazione delle interfacce dei listener che deniscono il comportamento dellapplicazione La main class dellapplicazione si limita a istanziare il componente della nestra principale dellapplicazione (da cui lutente può accedere alle diverse funzionalità) ed a visualizzarlo.

35 Applicazione minimale (2) Il thread principale termina ed il controllo passa allevent dispatcher. Lapplicazione termina quando viene chiusa la nestra principale (dallutente o mediante API) oppure si invoca listruzione di chiusura (System.exit(int)). Linsieme dei tipi di evento è in genere quello previsto dalla libreria, in quanto eventuali nuovi tipi non sarebbero processabili dal dispatcher. Ciò non impedisce, tuttavia, di estendere linsieme per ereditarietà (specializzazione).

36 Esempio completo (1) Si supponga di voler implementare una calcolatrice che permetta di eseguire le quattro operazioni aritmetiche. Deve essere possibile specicare i due operandi, indicare loperazione e quindi leggere il risultato.

37 Esempio completo (2) Il modulo puo essere realizzato con un componente di tipo frame, CalcFrame che estende la classe JFrame, introducendo: 2 campi per limputazione degli operandi, realizzati con dei controlli JTextField; 4 pulsanti (controlli JButton) per selezionare loperazione desiderata; 1 campo per la visualizzazione del risultato, con un controllo di tipo JTextField non modicabile dallutente (editabile).

38 Esempio completo (3) import javax.swing.*; import java.awt.event.*; import java.awt.*; public class CalcFrame extends JFrame { private JPanel jContentPane = null; private JTextField firstOpTextField = null; private JTextField secondOpTextField = null; private JButton sumButton = null;... private JTextField resultTextField = null;

39 Esempio completo (4) public CalcFrame() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("Calc"); }... }

40 Esempio completo (5) La proprieta defaultCloseOperation serve a specicare che lapplicazione deve terminare quando la nestra in questione viene chiusa. Linizializzazione del modulo e basata sullinizializzazione dei diversi controlli e la loro registrazione nel panello predenito (jContentPane) del frame. private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout( new FlowLayout()); jContentPane.add(getFirstOpTextField(), null);

41 Esempio completo (6) jContentPane.add(getSecondOpTextField(), null); jContentPane.add(getSumButton(), null);... jContentPane.add(getResultTextField(), null); } return jContentPane; } La proprieta layout permette di impostare il layout manager, in questo caso si e optato per un semplice ow layout, che dispone I controlli in righe successive (simile allimpaginazione di un testo).

42 Esempio completo (7) Linizializzazione di un controllo, ad es., un campo viene eseguita da un metodo specico: private JTextField getFirstOpTextField() { if(firstOpTextField == null) { firstOpTextField = new JTextField(); firstOpTextField.setColumns(10); } return firstOpTextField; } private JTextField getResultTextField() { if(resultTextField == null) { resultTextField = new JTextField();

43 Esempio completo (8) resultTextField.setColumns(10); resultTextField.setEditable(false); } return resultTextField; } La proprieta columns specica lampiezza del campo (numero di caratteri), mentre la proprieta editable indica se il contenuto del campo e modicabile dallutente. I campi non editabili sono utilizzati per presentare informazioni in sola lettura (ad es., il risultato di unelaborazione). Le etichette sono utilizzate per presentare informazioni statiche (che non cambiano nel corso dellesecuzione).

44 Esempio completo (9) Per quanto riguarda le operazioni, i metodi di inizializzazione dei controlli specicano il listener con una classe anonima interna: private javax.swing.JButton getSumButton() { if(sumButton == null) { sumButton = new JButton(); sumButton.setText("+"); sumButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("actionPerformed()"); try { int firstOp = Integer.parseInt(getFirstOpTextField().getText());

45 Esempio completo (10) int secondOp = Integer.parseInt(getSecondOpTextField().getText()); int result = firstOp + secondOp; getResultTextField().setText( Integer.toString(result)); } catch (NumberFormatException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE); } } // public void actionPerformed(e) });

46 Esempio completo (11) } // if (sumButton == null) return sumButton; } Levento di tipo action corrisponde allazione di attivazione del pulsante indipendentemente dalla modalita con cui questa e stata indicata dallutente (ad es., click del mouse, pressione di un tasto, ecc.). La classe JOptionPane implementa la struttura di base di un dialogo modale ed offre i metodi per visualizzare messaggi di avviso/conferma (showXXX).

47 Esempio completo (12) Il metodo main del modulo si limita allistanziazione e visualizzazione dello stesso: public static void main(String[] args) { JFrame frame = new CalcFrame(); frame.validate(); frame.setVisible(true); }

48 I modelli (1) I controlli piu semplici, ad es., i campi di testo, hanno una rappresentazione del dato generalmente basata su una proprietà strutturalmente da intendersi come atomica. Si tratta di unapplicazione del pattern observer.

49 I modelli (2)

50 I modelli (3) Nel caso di controlli piu complessi, ad es., liste di selezione è necessario denire modelli dati piu sosticati, ad es., è necessario rappresentare linsieme delle voci e la selezione corrente. Per fare ciò viene introdotto il concetto di data model, ovvero di un componente non visuale che adatta le strutture dati speciche dellapplicazione con il modello dati tipico del controllo visuale. Ogni controllo prevede un particolare tipo di data model, generalmente denito mediante uninterfaccia o una classe base astratta.

51 I modelli (4) Per comodità sono implementati dei data model di default basati su rappresentazioni convenzionali dei dati (array, liste, ecc.). In alternativa alla denizione di un data model custom si può utilizzare un default data model scrivendo unopportuna funzione che converte i dati dal modello dellapplicazione a quello del data model. Ad es., il default model di una lista di selezione è un vettore di oggetti (Vector), mentre quello di una tabella è una matrice di Object (Object[][]). Queste strutture dati possono non essere lideale nel caso di dati archiviati in una base dati (generalmente accessibili mediante un ResultSet di JDBC), quindi è necessario sviluppare dei data model specializzati.

52 Strumenti di sviluppo Per la realizzazione dei moduli di GUI esistono numerosi strumenti per lo sviluppo rapido o visuale (denominati RAD: rapid application development), che permettono di comporre visivamente l'interfaccia e poi generare il codice corrispondente e/o viceversa (dual-way tool). Per lo sviluppo in JFC/Swing esistono moltissimi RAD, tra cui: Eclipse platform (con il plug-in Visual Editor): NetBeans:

53 Riferimenti e tutorial Tutorial Sun Microsystems in rete: Amy Fowler. A Swing Architecture Overview: The Inside Story on JFC Component Design. Avail. on line at Sun Microsystems Inc. The Swing Tutorial or Creating a GUI with JFC/Swing. Avail. on line at Sun Microsystems Inc. JavaBeans(TM) Specication Sun Microsystems Inc., 1997.


Scaricare ppt "Introduzione a JFC/Swing Progetto di Basi di Dati 2007/2008 Domenico Lembo, Luigi Dragone, Marzo Ruzzi e Daniele Calisi Queste slide saranno online:"

Presentazioni simili


Annunci Google