Programmazione Java: Interfacce grafiche (GUI) Romina Eramo [email protected] http://www.di.univaq.it/romina.eramo/tlp Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Interfacce grafiche (GUI) (1) “Rendere facili le cose semplici e possibili le cose difficili” › Obiettivo: consentire al programmatore di costruire un’interfaccia adatta per tutte le piattaforme » Libreria GUI (graphical User Interface) di Java 1.0 non raggiunge l’obiettivo » Libreria AWT di Java 1.0 caratterizzata da notevoli limiti » Libreria Swing di Java 1.2 fornisce un approccio più chiaro e orientato agli oggetti Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Swing › Approccio orientato ad oggetti » modello di programmazione a componenti che consente la facile creazione di ambienti di sviluppo visuali › Fornisce un ricco insieme di oggetti JavaBean » facili da utilizzare e comprendere » possono essere trascinati, incollati, ma anche programmati manualmente, per creare GUI apprezzabili Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Swing: risorse › Libri Thinking in Java 4 ed. Volume 3 Concorrenza e interfacce grafiche Autore: Bruce Eckel Casa Editrice: Pearson ISBN: 8871923057 › Java Tutorial – Swing Trial » http://docs.oracle.com/javase/tutorial/uiswing/index.html › Swing Documentation » http://docs.oracle.com/javase/7/docs/technotes/guides/swing/ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Nozioni di base su Swing (1) › JFrame: modulo (form) che crea una finestra in modo indipendente dal sistema operativo import javax.swing.*; ! Indica come chiudere la finestra (pulsante o tastiera) public class HelloSwing { ! public static void main(String[] args) { ! JFrame frame = new JFrame("Hello Swing"); ! Indica di chiudere definitivamente il programma frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ! frame.setSize(300, 100); ! frame.setVisible(true); ! } ! } ! Rende la finestra visibile Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Nozioni di base su Swing (2) › JLabel: definisce un’area per testo e/o immagini import javax.swing.*; ! import java.util.concurrent.*; ! public class HelloLabel { ! public static void main(String[] args) throws Exception { ! JFrame frame = new JFrame("Hello Swing"); ! JLabel label = new JLabel("A Label"); ! frame.add(label); ! frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ! frame.setSize(300, 100); ! frame.setVisible(true); ! TimeUnit.SECONDS.sleep(1); ! label.setText("Hey! This is Different!"); ! } ! } ! (Vedere HelloLabel.java, SubmitLabelManipulationTask.java, SubmitSwingProgram.java) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Nozioni di base su Swing (3) › JButton: implementazione di un pulsante import javax.swing.*;! import java.awt.*;! import static net.mindview.util.SwingConsole.*;! ! public class Button1 extends JFrame {! private JButton! b1 = new JButton("Button 1"),! Prima che un elemento sia b2 = new JButton("Button 2");! public Button1() {! disposto sul JFrame viene setLayout(new FlowLayout());! assegnato un “gestore di layout” add(b1);! di tipo FlowLayout add(b2);! }! public static void main(String[] args) {! run(new Button1(), 200, 100);! }! }! (Vedere Button1.java, Button2.java) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Nozioni di base su Swing (4) › JTextField: implementa una singola riga di testo DocumentListener myListener = ??;! Le modifiche possono essere monitorate aggiungendo TextListener per TextEvents. JTextField myArea = ??;! myArea.getDocument().addDocumentListener(myListener);! › JTextArea: implementa un’area di testo multi-linea DocumentListener myListener = ??;! JTextArea myArea = ??;! myArea.getDocument().addDocumentListener(myListener);! In JTextComponent, le modifiche sono trasmesse dal modello tramite un DocumentEvent verso un DocumentListeners. Il DocumentEvent fornisce la posizione della modifica e il tipo di cambiamento se desiderato. Romina Eramo Tecnologie dei Linguaggi di Programmazione (Vedere Button2.java, TextArea.java) DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Nozioni di base su Swing (5) › La disposizione dei componenti è controllata mediante “layout manager” che decidono come devono essere visualizzati i componenti in base all’ordine in cui sono stati aggiunti - add()! › JApplet, JFrame, JWindws, JDialog, JPanel ecc. possono contenere e visualizzare oggetti Component. In Container è presente un metodo setLayout() che consente di scegliere un layout manager: » » » » » BorderLayout! FlowLayout! GridLayout! GridBagLayout! BoxLayout! » ... (Vedere BorderLayout1.java, FlowLayout1.java, GridLayout1.java) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Modello a eventi di Swing (1) › Un componente può attivare un evento (rappresentato da una classe separata) › L’evento è ricevuto da uno o più listener che agiscono su di esso (rappresentato da una classe che implementa un tipo di interfaccia listener) › Creare un oggetto listener e registrarlo con il componente che sta attivando l’evento add<TipoEvento>Listener();! (Vedere ShowAddListeners.java) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Tipi di eventi e di listener (1) Tutti i componenti Swing includono metodi addXXXLister() e removeXXXListener() Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Tipi di eventi e di listener (2) Tutti i componenti Swing includono metodi addXXXLister() e removeXXXListener() Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Componenti Swing Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Swing API reference http://docs.oracle.com/javase/6/docs/technotes/guides/swing/reference.html Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche