La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Docente: Gabriele Lombardi

Presentazioni simili


Presentazione sul tema: "Docente: Gabriele Lombardi"— Transcript della presentazione:

1 Docente: Gabriele Lombardi lombardi@dsi.unimi.it
AWT e Swing Docente: Gabriele Lombardi © CEFRIEL

2 The present original document was produced by CEFRIEL and the Teacher for the benefit and internal use of this course, and nobody else may claim any right or paternity on it. No right to use the document for any purpose other than the Intended purpose and no right to distribute, disclose, release, furnish or disseminate it or a part of it in any way or form to anyone without the prior express written consent of CEFRIEL and the Teacher. © copyright Cefriel and the Teacher-Milan-Italy-23/06/2008. All rights reserved in accordance with rule of law and international agreements. © CEFRIEL

3 Sommario Toolkits AWT AWT: Packaging AWT: Varie Swing Swing: MVC
SLIDE CONTENUTO Toolkits Cosa sono e che tipologie ne esistono AWT Peers, componenti, gestione eventi AWT: Packaging Contenitori e layout managers AWT: Varie Colori, font, geometria, immagini, stampa, … Swing Problemi di AWT? Soluzione? Swing: MVC Analisi di un componente di esempio Swing: Varie Rassegna dei componenti © CEFRIEL

4 Toolkits Scopo: interfacce uomo-macchina (grafiche);
consentire al programmatore di definire: interfacce uomo-macchina (grafiche); in maniera semplice (dichiarativa); pienamente funzionanti: gestione “interna” degli eventi (dell’utente); gestione “esterna” degli eventi (dell’utente); Tipologie: costruttive: la struttura dati contenente gli “oggetti grafici” viene costruita dal programmatore: GTK, QT, MFC, AWT, Swing, … dichiarative: la struttura dati contenente gli “oggetti grafici” viene definita tramite un apposito linguaggio: Glade, XUL, XAML, … © CEFRIEL

5 Primo toolkit per interfacce grafiche in Java:
AWT Primo toolkit per interfacce grafiche in Java: basato sull’idea di riutilizzo dei toolkit esistenti; definito attorno al concetto di peers: ogni componente è un wrapper per un componente del sistema grafico ospitante; offre un’infrastruttura di accesso a componenti: esistenti nel sistema operativo ospitante; quindi solo un subset comune hai SO considerati (massimo subset comune). Vantaggi: molto efficiente. Svantaggi: autolimitato dal rodotto subset di componenti esterne. © CEFRIEL

6 AWT: Packaging Problema: panelli, finestre, … componenti in generale!
definire il layout delle componenti uno nell’altro; astrazione dei contenitori: panelli, finestre, … componenti in generale! Soluzione: definire i “gestori di layout” come astrazione di … “coloro che impacchettano i componenti”; realizzare differenti implementazioni per ottenere svariate modalità di “impacchettamento”: box, flow, grid, gridbag, … parametri di preferenza per il packaging: dimensioni massime, minime, preferite; tipo di layout; ordine e posizione di inserimento; © CEFRIEL

7 AWT: Gestione degli eventi
Ogni evento: è un oggetto istanziato quando si verifica; deriva direttamente o indirettamente da EventObject; trasporta le informazioni che lo caratterizzano; viene passato ai gestori di quel tipo di evento. Ogni gestore: implementa l’interfaccia (marchio) EventListener; di solito implementa direttamente un’interfaccia che estende la precedente, aggiungendo gli handler; il nome degli handler è del tipo “*Listener”; esistono spesso degli adapter, implementano tutte le risposte vuote (di cui fare override) comodità! vedere Code\03_AWT&Swing\AWT con: esempio di base di creazione di una finestra packaging di componenti cattura di un evento Usiamolo!!! © CEFRIEL

8 rendering, dimensioni, glifi, … java.awt.print:
java.awt.color: gestione di due aspetti relativi al colore: spazio colore: RGB, Ycbcr, Luv, Lab, XYZ, HSV, … profilo: numero, codifica e posizione delle componenti: RGB, RGBA, ARGB, ABGR, 8 bit, 12 bit, … java.awt.font: gestione delle famiglie/tipologie/sottotipologie di font; gestione del loro aspetto grafico: rendering, dimensioni, glifi, … java.awt.print: strumenti di impaginazione della stampa. © CEFRIEL

9 * java.awt.** java.awt.geom: forme geometriche: trasformazioni:
strumenti di geometria 2D: forme geometriche: punti, linee, curve, archi, rettangoli, … trasformazioni: similarità, affinità, … java.awt.image: memorizzazione: strategie di buffering; formato dei dati (colormodel); trasformazione: affine, … filtering: lineare (convoluzione con kernel); generale (tramite ImageFilter); inoltre: SampleModel, PixelGrabber, ImageProducer, ImageConsumer, ImageObserver, LookupTable, … * © CEFRIEL

10 Swing: intro Problemi con AWT? Soluzione di Swing:
componenti limitate (subset comune); impossibile realizzare componenti custom; chiamate indirette al SO tramite wrapper. Soluzione di Swing: costruire le proprie componenti da zero: all’interno di un java.awt.Component; le componenti si disegnano da sé; Swing gestisce eventi di livello più basso; vantaggi di questa piccola evoluzione: set ampio di componenti preconfezionate; architettura indipendente dai peer  MVC; possibile creare componenti custom; efficiente essendo basato su Java2D … … che si appoggia su OpenGL o su DirectX. © CEFRIEL

11 Swing: intro Dove cosa: … altre nei sotto-package;
componenti in javax.swing.** … … altre nei sotto-package; tutte le componenti si chiamano javax.swing.J*; componenti figlie di JComponent: possiamo estendere questa componente noi stessi per creare componenti custom; nuove implementazioni di LayoutManager … … input, PLAF, eventi, e molto altro! Ricordarsi però che: Swing si appoggia ad AWT: spesso è richiesto l’utilizzo di package in esso contenuti (come java.awt.event.*); l’utilizzo CONSAPEVOLE di IDE con designer è consigliabile. © CEFRIEL

12 Swing: esempio Esercizio 1: si costruisca un’applicazione grafica che:
mostri una calcolatrice semplice; implementi le 4 operazioni algebriche +, -, *, /; implementi la funzionalità di memorizzazione: tasti MS e MR per salvare in memoria e per recuperare il valore; tasti M+ e M- per aggiungere e togliere al contenuto della memoria. Esercizio 2: si costruisca, utilizzando NetBeans: un’applicazione grafica di visualizzazione risultati query: funzionalità: mostrare su richiesta il contenuto delle tabelle di un database:  show tabellaUtenti  Pippo DePippis Papero DePaperis … … createne l’interfaccia, e inizialmente utilizzate funzionalità di quering fittizie, con java.sql potremo renderle reali query verso un database. © CEFRIEL

13 Swing: MVC MVC (Model View Controller): Model  la struttura dati;
pattern di separazione delle responsabilità sui dati; spesso usato per le interfacce grafiche; identifica i seguenti ruoli di manipolazione di una struttura dati: Model  la struttura dati; View  la rappresentazione (grafica) dei dati; Controller  gli algoritmi di modifica dei dati. In Swing: le componenti hanno lo scopo di permettere la visualizzazione e la generazione di eventi di manipolazione di dati (da parte dell’utente); i modelli ne rappresentano la struttura (ad es. ListModel); le viste sono le componenti grafiche; i controller sono ascoltatori di eventi (Listener). Vediamo: un esempio di utilizzo delle liste: lista di file come modello in una componente JList; si veda 03_AWT&Swing\Swing\SwingExamples01: sono stati inseriti svariati widget come esempio; si osservi il funzionamento della lista di file (con la classe FilesListModel realizzata come classe innestata di GeneratedExample). © CEFRIEL

14 Swing: esempio liste Definiamo un modello di lista basato sul
private static class FilesListModel implements ListModel { private String[] names; public FilesListModel(File baseDir) { names = baseDir.list(null); } public int getSize() { return names.length; } public Object getElementAt(int index) { return names[index]; } public void addListDataListener(ListDataListener l) {} public void removeListDataListener(ListDataListener l) {} } Definiamo un modello di lista basato sul contenuto di una directory private void btn_chooseDirActionPerformed( java.awt.event.ActionEvent evt) { // Aggiornamento della directory: JFileChooser chooser = new JFileChooser( fld_dirname.getText()); chooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY); if (chooser.showDialog(this, "Seleziona la directory") == JFileChooser.APPROVE_OPTION) { // Cambio directory: fld_dirname.setText( chooser.getSelectedFile().toString()); lst_files.setModel( new FilesListModel(chooser.getSelectedFile())); } } © CEFRIEL

15 Rassegna componenti Di seguito è riportata una lista di componenti:
non esaustiva, ne esistono molti standard … … e molti di più non standard ma open; di cui non si approfondisce l’utilizzo; per i quali si consiglia di provare a costruire un programma di esempio (uno per componente). Elenco di alcune delle componenti: JLabel, JButton, JToggleButton, JCheckBox, JRadioButton, JTextField, JPasswordFiled, JFormattedTextField, JTextArea, JList, JComboBox, JTree, JTable, JScrollBar, JProgressBar, JFrame, JDialog, JMenu, JMenuBar, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem, JSeparator, JPopupMenu, JFileChooser, JColorChooser, JOptionPane, JPanel, JScrollPane, JTextPane, JEditorPane, JSpinner, JSlider, JSplitPane, JTabbedPane, JDesktopPane, JLayeredPane, JInternalFrame, JToolBar, … inoltre è possibile realizzare nuove componenti custom. © CEFRIEL

16 Componenti di base JLabel: visualizzare un testo informativo:
JLabel lblExample = new JLabel(“Testo informativo”); lblExample.setText(“Altro testo”); JButton: pulsante per invocare un’azione: JButton btnExample = new JButton(“Clicca qui); btnExample.addActionListener(…); JToggleButton: per selezionare opzioni: JToggleButton tglExample = new JToggleButton(“ChangeMe”,true); if (tglExample.isSelected()) {…} JCheckBox: come il precedente: JCheckBox chkExample = new JCheckBox(“Option”); If (chkExample.isSelected()) {…} JRadioButton: selezione singola tra scelte multiple: ButtonGroup grp = new ButtonGroup(); grp.add(new RadioButton(“opt1”)); grp.add(new RadioButton(“opt2”)); System.out.println(“Azione: ” + grp.getSelection().getActionCommand()); JTextField, JPasswordFiled, JFormattedTextField, JTextArea: campi di testo semplice (nascosto in quanto password, formattato); JTextField fldExample = new JTextField(“Change this text”); System.out.println(“Testo: ” + fldExample.getText()); JFrame, JDialog, JPanel: contenitori di altri componenti: JPanel pnl = new JPanel(); JFrame frm = new JFrame(“Titolo”); JLabel lbl = new JLabel(“Qualcosa”); frm.add(pnl); pnl.add(lbl); © CEFRIEL

17 Componenti complesse JList: mostra una lista di elementi:
Una possibilità semplice è data dalla creazione della lista data una collezione (o array) di elementi: String[] data = {“Primo", “Secondo"}; JList lstExample = new JList(data); System.out.println(“Selezionato: ” + lstExample.getSelectedValue()); Come altro esempio si veda la classe GeneratedExample.FilesListModel in 03_AWT&Swing\Swing\SwingExamples01 JComboBox: lista con selezione singola: Si tratta di un JTextFiled composto con una JList in cui scegliere l’elemento da mostrare nel campo di testo. JTable: tabella (lista di tuple): Componente capace di mostrare una tabella con righe e colonne; Si provi a mostrare un JTable con un TableModel creato per generare le tabelline dei numeri interi forniti come parametro al costruttore. Si veda 03_AWT&Swing\Swing\SwingExamples01, la classe TabellinaTableModel e sotto la scheda “tab2”. JTree: gerarchia di elementi: Componente di visualizzazione di una gerarchia (albero) di elementi, come ad esempio le directory ed i file in un file-system (si pensi a gestione risorse). Se adeguatamente re-implementato il modello TreeModel, si può definire un albero capace di caricare dati solo quando servono durante la navigazione. Si osservi, come esempio di caricamento al volo, le classi JDMSBrowser e DMSTreeNode in Code\02_BaseAPIs\Altre\DMS\DMS. © CEFRIEL

18 Altre componenti JMenuBar, JMenu, JMenuItem, JSeparator, JCheckBoxMenuItem, JRadioButtonMenuItem: permettono di creare definire una struttura (con radice in JMenuBar) che definisce una barra dei menu. JPopupMenu: menu contestuale (con item precedenti). JToolBar: barra degli strumenti. JOptionPane, JPanel, JScrollPane, JTextPane, JEditorPane, JSplitPane, JTabbedPane, JDesktopPane, JLayeredPane, JInternalFrame: contengono e organizzano altri JComponent con differenti scopi. JFrame, JDialog, JFileChooser, JColorChooser: finestre, finestre di dialogo, finestre di dialogo preconfezionate: JFileChooser fc = new JFileChooser(); if (fc. showOpenDialog(“?”)==JFileChooser.APPROVE_OPTION) { …chooser.getSelectedFile()…; © CEFRIEL

19 Chi disegna? Chi invoca gli handler?
AWT/Swing thread Chi disegna? Chi invoca gli handler? un thread apposito che esegue il classico “main loop”; effettua (tra le altre) le seguenti operazioni: estrae gli eventi dalla coda (java.awt.EventQueue); invoca i listener degli eventi nell’ordine di registrazione; invoca le funzionalità di ricalcolo del layout sulle componenti invalidate (tramite metodo invalidate); produce un Graphics e lo utilizza per richiedere il disegno delle componenti di alto livello (che gerarchicamente invocano il disegno di quelle che contengono, composite pattern). Invoco una operazione e non avviene! le modifiche dell’interfaccia grafica devono avvenire nel thread di AWT, quindi in un listener o tramite: EventQueue.invokeLater( new Runnable() { public void run() { /* operazione */ } }); © CEFRIEL


Scaricare ppt "Docente: Gabriele Lombardi"

Presentazioni simili


Annunci Google