Διδάσκων: Παναγιώτης Ανδρέου

Σχετικά έγγραφα
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #17

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

Week 10: Graphical User Interfaces

8. Το μοντέλο συμβάντων του AWT

Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #18

ημιουργία Γραφικού Περιβάλλοντος

Week 12: GUIs with Swing

ΓΡΑΦΙΚΕΣ ΔΙΕΠΑΦΕΣ ΧΡΗΣΤΗ- SWING (1)

VK -14/10/2016 Σελίς 1

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 12 : ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ GUI AWT ΚΑΙ

8.1 Top-Level Swing Containers και Swing Components

Ειδικά Θέματα Προγραμματισμού

Ειδικά Θέματα Προγραμματισμού

Οντοκεντρικός Προγραμματισμός

7. Ανάπτυξη GUI σε Java

9.1 JFC Swing. 9.1 JFC Swing Java (GUI) Java. Java Foundation Classes (JFC) Swing GUI. JFC Card Pile GameFrame GUI

Το επόμενο σχήμα εμφανίζει την ιεραρχία των GUI-components κλάσεων μαζί με κάποιες επιπλέον συμπληρωματικές κλάσεις που διαχειρίζονται ένα GUI.

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Δημιουργία αντικειμένων γραφικών διεπαφών (GUI objects) // Δημιουργία πλήκτρου με κείμενο OK JButton jbtok = new JButton("OK");

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

VK -14/10/2016 Σελίς 1

9. Η βιβλιοθήκη Components του AWT

Βιοϊατρική τεχνολογία

Σύνθεταγραφικάσ ε Java

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2008 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

Περιεχόµενα. Πρόλογος...15

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

New Project Windows Forms Applications

Γραφικές ιεπαφές Χρήστη και Γραφικά

Εφαρμογή Αναζήτησης στον Ελληνικό Γεωγραφικό Χώρο

Αντικειμενοστρεφής Προγραμματισμός

Οπτικός Προγραμματισμός σε NetBeans με Java Swing

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

Προγραμματισμός Διαδικτύου

Μέρος ΙΙ Εφαρμογές γραφικών με το πακέτο swing - 5. Περιεχόμενα

Εργαστήριο 6 - Άσκηση - Ανάλυση

Διδάσκων: Παναγιώτης Ανδρέου

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13

Εργαστήριο 2 - Άσκηση - Ανάλυση

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (java threads)

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Περιεχόμενα. Πρόλογος 15

10.1 Γενικά για τα streams

8. Μέθοδοι (Methods)

24. ΓΡΑΦΙΚΑ ΠΕΡΙΒΑΛΛΟΝΤΑ

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Προγραμματισμός ΙΙ (Java) 8-9. Γραφικές Διεπαφές

Εργαστήριο 5 - Άσκηση - Ανάλυση

Περιεχόμενα. Πρόλογος 15

Εισαγωγή. Κεφάλαιο 2: Βασικές έννοιες Java Κεφάλαιο 3: Χρήση της Java στις σελίδες σας Κεφάλαιο 4: Οι πρώτες σας μικροεφαρμογές...

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Εργαστήριο 4 - Άσκηση - Ανάλυση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING Event-driven programming

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING Event-driven programming

Αντικειµενοστρεφής Προγραµµατισµός

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING Event-driven programming

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγικές έννοιες. Ιωάννης Γ. Τσούλος 2014

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

Εργαστήριο 3 - Άσκηση - Ανάλυση

Περιεχόμενα. Πρόλογος... 17

Προγραμματισμός Διαδικτύου

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Ειδικά Θέματα Προγραμματισμού

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Επαναληπτικό φύλλο εργασίας 07/04/2009

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Ask1, Ask2, Ask3. private void jbutton1actionperformed(java.awt.event.actionevent evt) { jlabel1.settext( "You pressed the 1st button" ); }

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Create Sprite at Runtime

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Βασικά της γλώσσας JAVA

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Γενικά (για τις γραπτές εξετάσεις)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

VK - 04/11/2016- [1]

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιασύνδεση µε χρήστη: Swing ΙΙ. Window Listeners

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006)

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Wrapper Classes, Abstract Classes and Interfaces

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Ανάπτυξη Plugins για το AgentSheets

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Transcript:

Διάλεξη 18: Προγραμματισμός με Γραφικά (Graphics Programming) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Οι βιβλιοθήκες AWT και SWING, κύρια αντικείμενα -Προγραμματισμός με συμβάντα (event-driven programming) Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 1

Προγραμματισμός με Γραφικά Εξαιρετικό παράδειγμα που συνδυάζει όλες τις έννοιες του αντικειμενοστρεφή προγραμματισμού Όλες οι γλώσσες προγραμματισμού (π.χ., JAVA:swing-awt, C#:System.Drawing, Visual Basic:System.Drawing, C++:OpenGL) περιέχουν βιβλιοθήκες για την δημιουργία γραφικών διαπροσωπειών Αυτές οι βιβλιοθήκες εξελίσσονται ραγδαία με κάθε ανανέωση του API! Υποστηρίζουν προγραμματισμό γραφικών για διαπροσωπείες υπολογιστή και διαδικτυακές εφαρμογές (π.χ., JAVA:applets, servlets, jsp) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 2

Παράδειγμα Γραφικών στην JAVA Label Text field Check Box Radio Button Button // Create a button with text OK JButton jbtok = new JButton("OK"); // Create a label with text "Enter your name: " JLabel jlblname = new JLabel("Enter your name: "); // Create a text field with text "Type Name Here" JTextField jtfname = new JTextField("Type Name Here"); // Create a check box with text bold JCheckBox jchkbold = new JCheckBox("Bold"); // Create a radio button with text red Combo Box JRadioButton jrbred = new JRadioButton("Red"); // Create a combo box with choices red, green, and blue JComboBox jcbcolor = new JComboBox(new String[] { "Red","Green","Blue"); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 3

Βιβλιοθήκες Γραφικών (javax.swing vs. java.awt) Έχουμε χρησιμοποιήσει αντικείμενα με όνομα J< >, π.χ., Jbutton Αυτά τα αντικείμενα ανήκουν στην βιβλιοθήκη javax.swing Γιατί δεν ονομάστηκε απλά Button η κλάση; Επειδή ήδη υπάρχει η κλάση Button στην βιβλιοθήκη java.awt Η βιβλιοθήκη java.awt(abstract Windows Toolkit) ήταν η πρώτη βιβλιοθήκη που δημιουργήθηκε για γραφικά στην JAVA Τα αντικείμενα της AWT συνδέονται αυτόματα με συστατικά της πλατφόρμας με την οποία τρέχει: Πρόβλημα: Προβλήματα της πλατφόρμας ανάγονται στο πρόγραμμα Με την έκδοση της JAVA 2ενσωματώθηκε η βιβλιοθήκη Swingη οποία επιτρέπει τον σχεδιασμό αντικειμένων απευθείας με java κώδικα (εκτός από java.awt.windowor java.awt.panel) που πρέπει να σχεδιαστούν από την πλατφόρμα/λειτουργικό. Πλεονέκτημα 1: μεγάλη ανεξαρτησία από την πλατφόρμα Πλεονέκτημα 2: χρήση πιο λίγων πόρων από την πλατφόρμα Τα αντικείμενα της Swing αναφέρονται σαν lightweight components ενώ της AWT σαν heavyweight ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 4

Ιεραρχία Κλάσεων swing Κλάσεις στην βιβλιοθήκη AWT heavyweight Κλάσεις τύπου Container(π.χ., JFrame) μπορούν να περιέχουν αντικείμενα lightweight Κλάσεις στην βιβλιοθήκη SWING ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 5

Συστατικά GUI (swing) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 6

Frames Τοframeείναι ένα είδος παράθυρου το οποίο δεν περιέχεται σε άλλο παράθυρο Είναι container: μπορεί να περιέχει άλλα αντικείμενα import javax.swing.jframe; public class MyFrame { public static void main(string[] args) { JFrame frame = new JFrame("Test Frame"); frame.setsize(400, 300); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 7

Πρόσθεση αντικειμένων σε Frames Η πρόσθεση αντικειμένων γίνεται με την συνάρτηση frame.add() ( frame.getcontentpane().add() ): 1. με πρώτα την δημιουργία του αντικειμένου και μετά πρόσθεση του 2. Με ταυτόχρονη δημιουργία του αντικειμένου και πρόσθεση του import javax.swing.jframe; public class MyFrame { public static void main(string[] args) { JFrame frame = new JFrame("Test Frame"); frame.set JButton jbtok = new JButton("OK"); frame.add(jbtok); frame.add(new JButton("OK")); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 8

Διαχειριστές Σχεδίου (Layout Managers) Οι layout managers καθορίζουν πως θα εμφανίζεται η διαπροωπεία σε οποιαδήποτε πλατφόρμα που υποστηρίζει παράθυρα (windows) Κάθε container έχει ένα layout manager που διαρρυθμίζει τα γραφικά αντικείμενα μέσα στο container. Για να καθορίσουμε τον διαχειριστή ενός containerχρησιμοποιούμε την μέθοδο setlayout(layoutmanager). Παραδείγματα LayoutManager: FlowLayout: το ένα αντικείμενο κάτω από το άλλο σειριακά GridLayout: διαρρύθμιση μέσα σε πίνακα BorderLayout: διαρρύθμιση σε East, South, West, North, Center. ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 9

Παραδείγματα Layout Managers import javax.swing.jlabel; import javax.swing.jtextfield; import javax.swing.jframe; import java.awt.flowlayout; public class ShowFlowLayout extends JFrame { public ShowFlowLayout() { // Set FlowLayout, aligned left with horizontal gap 10 // and vertical gap 20 between components setlayout(new FlowLayout(FlowLayout.LEFT, 10, 20)); add(new JLabel("First Name")); add(new JTextField(8)); add(new JLabel("MI")); add(new JTextField(1)); add(new JLabel("Last Name")); add(new JTextField(8)); public static void main(string[] args) { ShowFlowLayout frame = new ShowFlowLayout(); frame.settitle("showflowlayout"); frame.setsize(200, 200); frame.setlocationrelativeto(null); // Center the frame frame.setdefaultcloseoperation(jframe.exit_on_ CLOSE); frame.setvisible(true); import javax.swing.jlabel; import javax.swing.jtextfield; import javax.swing.jframe; import java.awt.gridlayout; public class ShowGridLayout extends JFrame { public ShowGridLayout() { // Set GridLayout, 3 rows, 2 columns, and gaps 5 between components horizontally and vertically setlayout(new GridLayout(3, 2, 5, 5)); // Add labels and text fields to the frame add(new JLabel("First Name")); add(new JTextField(8)); add(new JLabel("MI")); add(new JTextField(1)); add(new JLabel("Last Name")); add(new JTextField(8)); /** Main method */ public static void main(string[] args) { ShowGridLayout frame = new ShowGridLayout(); frame.settitle("showgridlayout"); frame.setsize(200, 125); frame.setlocationrelativeto(null); // Center the frame frame.setdefaultcloseoperation(jframe.exit_on_ CLOSE); frame.setvisible(true); import javax.swing.jbutton; import javax.swing.jframe; import java.awt.borderlayout; public class ShowBorderLayout extends JFrame { public ShowBorderLayout() { // Set BorderLayout with horizontal gap 5 and vertical gap 10 setlayout(new BorderLayout(5, 10)); // Add buttons to the frame add(new JButton("East"), BorderLayout.EAST); add(new JButton("South"), BorderLayout.SOUTH); add(new JButton("West"), BorderLayout.WEST); add(new JButton("North"), BorderLayout.NORTH); add(new JButton("Center"), BorderLayout.CENTER); /** Main method */ public static void main(string[] args) { ShowBorderLayout frame = new ShowBorderLayout(); frame.settitle("showborderlayout"); frame.setsize(300, 200); frame.setlocationrelativeto(null); // Center the frame frame.setdefaultcloseoperation(jframe.exit_on_ CLOSE); frame.setvisible(true); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 10

Διαχείριση Χρωμάτων Ο καθορισμός χρωμάτων γίνεται μέσω της java.awt.colorβάση του πρότυπου red-green-blue (RGB) Δημιουργία Χρωμάτων: Color c = new Color(r, g, b); Παράδειγμα γραφικών μεθόδων που χρησιμοποιούν χρώματα: Για το background: setbackground(color c) Για το foreground: setforeground(color c) import javax.swing.jframe; public class MyFrame { public static void main(string[] args) { JFrame frame = new JFrame("Test Frame"); frame.set JButton jbtok = new JButton("OK"); jbtok.setforeground( new Color(255,255,255)); jbtok.setbackground( new Color(0,0,0)); frame.add(jbtok); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 11

Panels Τα Panels χρησιμοποιούνται σαν sub-containers για οργάνωση Συνήθως, τοποθετούμε τα components μέσα σε panels και μετά τα panels στο frame Παράδειγμα: JPanelp = new JPanel(); p.add(new JButton("OK")); // In class code. JPanel p1 = new JPanel(); p1.setlayout(new GridLayout(4, 3)); // Add buttons to the panel for (int i = 1; i <= 9; i++) { p1.add(new JButton("" + i)); p1.add(new JButton("" + 0)); p1.add(new JButton("Start")); p1.add(new JButton("Stop")); JPanel p2 = new JPanel( new BorderLayout()); p2.add(new JTextField( "Time to be displayed here"), BorderLayout.NORTH); p2.add(p1, BorderLayout.CENTER); // add contents into the frame add(p2, BorderLayout.EAST); add(new JButton( "Food to be placed here"), BorderLayout.CENTER); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 12

Σχεδίαση Αυθαίρετων Γραφικών (Custom Graphics) Πως σχεδιάζουμε αυθαίρετα (custom) γραφικά; Με την χρήση της κλάσης java.awt.graphics Παρέχει μεθόδους για σχεδίαση γραμμών, ορθογώνιων, κτλ. Σύστημα Συντεταγμένων JAVA Σύστημα Συντεταγμένων σε αντικείμενα ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 13

Παράδειγμα Σχεδίασης Αυθαίρετων Γραφικών drawrect(int x, int y, int w, int h); fillrect(int x, int y, int w, int h); (x, y ) (x, y) h h w w drawoval(int x, int y, int w, int h); filloval(int x, int y, int w, int h); ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 14

Διαχείριση Συμβάντων (Event handling) Ερώτηση: Έστω ότι θέλουμε να διαχειριστούμε το τι συμβαίνει όταν ο χρήστης πατήσει ένα κουμπί. Πως γίνεται αυτό; Παράδειγμα: όταν πατήσω το κουμπί OK να εκτελείται System.out.println("OK clicked"); Απάντηση:Χρησιμοποιώντας προγραμματισμός με συμβάντα (event-driven programming) Βασική διαφορά Procedural vs. Event-driven Programming Procedural Programming:η εκτέλεση είναι σειριακή βάση μίας ροής Event-driven Programming:η εκτέλεση γίνεται όταν συμβεί κάποιο συμβάν (event) π.χ., πάτημα ενός κουμπιού ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 15

Παράδειγμα Event Handling με Listener import javax.swing.*; import java.awt.event.*; public class HandleEvent extends JFrame { public HandleEvent() { // Create and add button ok JButton jbtok = new JButton("OK"); add(jbtok); // Register listeners OKListenerClass listener1 = new OKListenerClass(); jbtok.addactionlistener(listener1); public static void main(string[] args) { JFrame frame = new HandleEvent(); frame.settitle("handle Event"); frame.setsize(200, 150); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); class OKListenerClass implements ActionListener { public void actionperformed(actionevent e) { System.out.println("OK button clicked"); H HandleEvent «είναι» ένα JFrame Δημιουργία ενός listener. Ο listener «ακούει» για διάφορα συμβάντα. Που είναι ορισμένος; ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 16

Διαχείριση Συμβάντων (Event handling)(συν.) Η συνάρτηση void addactionlistener(actionlistenerl) προσθέτει ένα Listener (ActionListener) στο κουμπί jbtok. java.awt.event.actionlistener: είναι μία διαπροσωπεία (interface) που πρέπει να υλοποιεί κάθε Listener κλάση Η κλάση Listener που δημιουργούμε, παρέχει δηλώσεις που ορίζουν τι θα γίνει όταν συμβεί ένα event. class OKListenerClass implements ActionListener { public void actionperformed(actionevent e) { System.out.println("OK button clicked"); Ένα event μπορεί να θεωρηθεί ένα σήμα (signal) από το πρόγραμμα που δηλώνει ότι κάτι έχει συμβεί Έχουμε ορίσει ακόμα μία top-level κλάση στο ίδιο αρχείο! ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 17

Κλάσεις Συμβάντων (Event Classes) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 18

Συσχέτιση Ενεργειών Χρήστη με Events User Action Source Object Event Type generated Click a button JButton ActionEvent Click a check box JCheckBox ItemEvent, ActionEvent Click a radio button JRadioButton ItemEvent, ActionEvent Press return on a text field JTextField ActionEvent Select a new item JComboBox ItemEvent, ActionEvent Window opened, closed, etc. Window WindowEvent Mouse pressed, released, etc. Component MouseEvent Key released, pressed, etc. Component KeyEvent ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 19

Συσχέτιση Events με Event Handlers Event Class Listener Interface Listener Methods (Handlers) ActionEvent ActionListener actionperformed(actionevent) ItemEvent ItemListener itemstatechanged(itemevent) WindowEvent WindowListener windowclosing(windowevent) windowopened(windowevent) windowiconified(windowevent) windowdeiconified(windowevent) windowclosed(windowevent) windowactivated(windowevent) windowdeactivated(windowevent) ContainerEvent ContainerListener componentadded(containerevent) componentremoved(containerevent) MouseEvent MouseListener mousepressed(mouseevent) mousereleased(mouseevent) mouseclicked(mouseevent) mouseexited(mouseevent) mouseentered(mouseevent) KeyEvent KeyListener keypressed(keyevent) keyreleased(keyevent) keytypeed(keyevent) ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 20

Παράδειγμα Event Handling με ΔΥΟ Listeners JButton jbtok = new JButton("OK"); add(jbtok); // Register listeners OKListenerClass listener1 = new OKActionListener(); jbtok.addactionlistener(listener1); OKListenerClass listener2 = new OKMouseListener(); jbtok.addmouselistener(listener2); public static void main(string[] args) { JFrame frame = new HandleEvent(); class OKActionListener implements ActionListener { public void actionperformed(actionevent e) { System.out.println("OK button clicked"); class OKMouseListener implements MouseListener { public void mouseclicked(mouseevent arg0) { System.out.println("mouseClicked"); public void mouseentered(mouseevent arg0) { System.out.println("mouseEntered"); Listener1 ActionListener Listener2 MouseListener ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 21

Προβλήματα Κλάσεων Listeners Στο προηγούμενο παράδειγμα έχουμε δηλώσει 2 listeners σαν δύο ξεχωριστές κλάσεις Οι κλάσεις αυτές θα χρησιμοποιηθούν μόνο μέσα στο συγκεκριμένο πρόγραμμα/κλάση που έχουμε αναπτύξει. Ερώτηση:Μήπως έχουν και άλλες κλάσεις πρόσβαση σε αυτές τις κλάσεις; Απάντηση: Δυστυχώς ΝΑΙ! (τουλάχιστον στο ίδιο πακέτο) Ερώτηση:Μπορώ να δηλώσω μία κλάση listener (ActionListener) που να την χρησιμοποιήσω με όλα τα αντικείμενα που έχω; Απάντηση: Δυστυχώς ΟΧΙ! Μπορώ όμως να υλοποιήσω την διαπροσωπεία ActionListenerστο top-level επίπεδο και να διαχειριστώ όλα τα ActionEvents από όλα τα αντικείμενα ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 22

Διαχείριση Events από πολλά αντικ. εντός κλάσης import public class HandleMultipleComponents extends JFrame implements ActionListener{ // Create two buttons JButton jbtok = new JButton("OK"); JButton jbtcancel = new JButton("Cancel"); public HandleMultipleComponents() { setlayout(new FlowLayout(FlowLayout.LEFT, 10, 20)); add(jbtok); add(jbtcancel); // Register class listener jbtok.addactionlistener(this); jbtcancel.addactionlistener(this); //Implement actionperformed public void actionperformed(actionevent e) { if (e.getsource() == jbtok) System.out.println("OK"); else if (e.getsource() == jbtcancel) System.out.println("Cancel"); public static void main(string[] args) { JFrame frame = new HandleMultipleComponents(); Υλοποίηση Διαπροσωπείας ActionListener Πρέπει να υλοποιηθεί η μέθοδος actionperformed() Πέρασμα του αντικειμένου της κλάσης (this) σαν παραμέτρο ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 23

Παρατηρήσεις Αν και η λύση της προηγούμενης διαφάνειας είναι ελκυστική ας αναλύσουμε τι συμβαίνει στις εξής περιπτώσεις: 1. Η διαπροσωπεία μας περιέχει n components Χρειαζόμαστε n if statements 2. Η διαπροσωπεία μας διαχειρίζεται m events Χρειαζόμαστε m μεθόδους διαχείρισης (actionperformed) 3. Η διαπροσωπεία μας περιέχει ncomponents και το καθένα εγείρει mevents Χρειαζόμαστε mμεθόδους διαχείρισης (actionperformed) και ο καθένας θα διαχειρίζεται nif statements (nx m) και αυτό χωρίς τον κώδικα διαχείρισης(δηλ. τι θα γράψουμε μέσα στη μέθοδο) Υπάρχει καλύτερη λύση; ΝΑΙ, τα nested (inner) classes. ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός 24