ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ
Στην Java εκτός από τις κλασικές εφαρμογές μπορούμε να δημιουργήσουμε και άλλους δύο τύπους εφαρμογών: τα Applets, τα οποία τρέχουν μέσα από κάποιο φυλλομετρητή (browser) και τρέχουν στον πελάτη (client) και τα Servelts, τα οποία τρέχουν στον εξυπηρετητή (server). Η Java Swing χρησιμοποιείται για την κατασκευή διεπαφών χρήστη, επομένως είναι ένα χρήσιμο εργαλείο για την κατασκευή εφαρμογών από την πλευρά του πελάτη και φυσικά χρησιμοποιείται σε κατασκευή Applets. Δρ. Κεραμόπουλος Ευκλείδης 3
Για να δημιουργήσουμε μία Java Swing Applet εφαρμογή θα πρέπει να επεκταθεί η JApplet κλάση. Ουσιαστικά το JApplet παίζει το ρόλο του JFrame στις εφαρμογές που έχουμε δει μέχρι τώρα. Στο NetBeans ξεκινάμε μία εφαρμογή AWT GUI Forms και επιλέγουμε Applet Form. Μία Applet εφαρμογή «τρέχει» από ένα Java-Enabled Browser. To JDK προσφέρει ένα πρόγραμμα το AppletViewer με το οποίο μπορούμε να δοκιμάσουμε τα Applets κατά την κατασκευή τους. Στο τελικό στάδιο κατασκευής τους θα πρέπει να καλέσουμε το Applet ως ενσωματωμένο σε HTML κώδικα. Δρ. Κεραμόπουλος Ευκλείδης 4
Κάθε Applet βασίζεται στον ίδιο σκελετό και πρέπει πάντα να έχει τέσσερις συγκεκριμένες μεθόδους: Για την εκκίνηση του Applet χρησιμοποιούμε τις μεθόδους: 1. init(), Είναι η πρώτη μέθοδος που καλείται και με αυτή γίνεται η αρχικοποίηση του Applet. Συνήθως, εδώ κατασκευάζεται το GUI. 2. start(), Καλείται αμέσως μετά την init(). Επίσης, καλείται για να επανεκκινήσει το Applet όταν σταματήσει. Παράδειγμα, αν φύγουμε από τη web σελίδα που φιλοξενεί το Applet τότε όταν γυρίσουμε στη σελίδα θα πρέπει να ξανατρέξει το start() για να τρέξει το Applet. Για τoν τερματισμό του Applet χρησιμοποιούμε τις μεθόδους: 1. stop(), με αυτή τη μέθοδο σταματά να τρέχει το Applet. Καλείται όταν φεύγουμε από τη σελίδα που περιέχει το Applet. 2. destroy(), με αυτή τη μέθοδο καταστρέφεται το applet. Ουσιαστικά ότι είναι σχετικό με το applet ξεφορτώνεται από τη μνήμη. Δρ. Κεραμόπουλος Ευκλείδης 5
Μέσα στις τέσσερις μεθόδους του σκελετού δεν γράφουμε κάτι σχετικό με τα συστατικά της εφαρμογής ή τη λειτουργία της. Καλούμε άλλες μεθόδους για αυτή τη δουλειά. Στην init() μέθοδο αντίστοιχα με την main(), καλούμε τη μέθοδο invokeandwait για να ορίσουμε ένα Runnable αντικείμενο του οποίου η μέθοδος run() θα εκτελεστεί σε ένα νέο νήμα (thread) Δρ. Κεραμόπουλος Ευκλείδης 6
public void init() { } try { SwingUtilities.invokeAndWait(new Runnable () { public void run() { } }); guiinit(); } catch(exception exc) { } System.out.println( Error"+ exc); Μέθοδος στην οποία υλοποιείται το GUI Δρ. Κεραμόπουλος Ευκλείδης 7
Ένα απλό παράδειγμα applet swing. Δρ. Κεραμόπουλος Ευκλείδης 8
1. import javax.swing.*; 2. import java.awt.*; 3. import java.awt.event.*; 4. public class AppletsDemo extends JApplet { 5. JButton jbtnone; 6. JButton jbtntwo; 7. JLabel jlab; 8. public void init() { 9. try { 10. SwingUtilities.invokeAndWait(new Runnable () { 11. public void run() { 12. guiinit(); 13. } 14. }); 15. } catch(exception exc) { 16. System.out.println( Error "+ exc); 17. } 18. } Κάνει επέκταση το JApplet H init() κάνει τη δουλειά της main() Κάθε νήμα ξεκινά με την run() Δρ. Κεραμόπουλος Ευκλείδης 9
19. public void start() { 20. } Η μέθοδος start() δεν χρησιμοποιείται σε αυτό το applet γιατί δεν χρειάζεται κάποια ανανέωση η σελίδα. 21. public void stop() { 22. } Η μέθοδος stop() δεν χρησιμοποιείται σε αυτό το applet 23. public void destroy() { 24. } Η μέθοδος destroy() δεν χρησιμοποιείται σε αυτό το applet 25. private void guiinit() { 26. setlayout(new FlowLayout()); 27. jbtnone = new JButton("One"); 28. jbtntwo = new JButton("Two"); 29. jlab = new JLabel("Press a button."); Στη μέθοδο guiinit() ξεκινά ο κώδικας swing applet. 30. jbtnone.addactionlistener(new ActionListener() { 31. public void actionperformed(actionevent le) { 32. jlab.settext("button One pressed."); 33. } 34. }); Δρ. Κεραμόπουλος Ευκλείδης 10
35. jbtntwo.addactionlistener(new ActionListener() { 36. public void actionperformed(actionevent le) { 37. jlab.settext("button Two pressed."); 38. } 39. }); 40. getcontentpane().add(jbtnone); 41. getcontentpane().add(jbtntwo); 42. getcontentpane().add(jlab); 43. } 44. } Δρ. Κεραμόπουλος Ευκλείδης 11
Ένα applet μπορεί να εκτελεστεί μέσα από browser. Για να γίνει αυτό μετά το JDK 7 update 45 θα πρέπει να οριστεί το επίπεδο ασφάλειας της java σε medium. Δρ. Κεραμόπουλος Ευκλείδης 12
Δρ. Κεραμόπουλος Ευκλείδης 13
Στη Java Swing μας προσφέρονται έτοιμα εργαλεία τα οποία αποτελούνται από συστατικά της Java Swing. Εδώ θα μελετήσουμε τα εργαλεία που προσφέρονται για εξυπηρέτηση διαλόγου. Το βασικό εργαλείο για διάλογο είναι το JDialog και το JOptionPane το οποίο βασίζεται στο JDialog. Δρ. Κεραμόπουλος Ευκλείδης 15
To JOptionPane δημιουργεί έτοιμα παράθυρα διαλόγου για να εξυπηρετήσει τέσσερις συνηθισμένες ανάγκες: Διαλόγους Ενημέρωσης (message) Διαλόγους Επιβεβαίωσης (confirmation) Διαλόγους Εισαγωγής (Input) Διαλόγους Επιλογής (Option) Δρ. Κεραμόπουλος Ευκλείδης 16
Ο Διάλογος Ενημέρωσης δημιουργεί ένα παράθυρο όπου ενημερώνει τον χρήστη με ένα μήνυμα. Κλείνει όταν ο χρήστης πατήσει το ΟΚ. Δρ. Κεραμόπουλος Ευκλείδης 17
Ο Διάλογος Επιβεβαίωσης δημιουργεί ένα παράθυρο όπου περιέχει μία ερώτηση ΝΑΙ/ΌΧΙ. Δρ. Κεραμόπουλος Ευκλείδης 18
Ο Διάλογος Εισαγωγής δημιουργεί ένα παράθυρο με το οποίο ο χρήστης εισάγει κάποια πληροφορία είτε εισάγοντας ένα αλφαριθμητικό είτε επιλέγοντας κάτι από μία λίστα. Δρ. Κεραμόπουλος Ευκλείδης 19
Ο Διάλογος Επιλογής δημιουργεί ένα παράθυρο με το οποίο ο χρήστης επιλέγει μία από ένα σύνολο επιλογών. Δρ. Κεραμόπουλος Ευκλείδης 20
Όλα τα παράθυρα διαλόγου JOptionPane είναι μονοτροπικά. Για να δημιουργήσουμε ένα παράθυρο διαλόγου JOptionPane χρησιμοποιούμε τις παρακάτω μεθόδους ανάλογα με το παράθυρο που θέλουμε να δημιουργήσουμε: 1. showconfirmdialog() 2. showinputdialog() 3. showmessagedialog() 4. showoptiondialog() Δρ. Κεραμόπουλος Ευκλείδης 21
Δρ. Κεραμόπουλος Ευκλείδης 22
1. import java.awt.*; 2. import java.awt.event.*; 3. import javax.swing.*; 4. class MsgDialogDemo { 5. JLabel jlab; 6. JButton jbtnshow; 7. JFrame jfrm; 8. MsgDialogDemo() { 9. jfrm = new JFrame("Simple Message Dialog"); 10. jfrm.setlayout(new FlowLayout()); 11. jfrm.setsize(400, 250); 12. jfrm.setdefaultcloseoperation(jframe.exit_on_close); 13. jlab = new JLabel(); 14. jbtnshow = new JButton("Show Dialog"); 15. 16. jbtnshow.addactionlistener(new ActionListener() { 17. public void actionperformed(actionevent le) { 18. JOptionPane.showMessageDialog(jfrm, "Disk Space is Low."); 19. jlab.settext("dialog Closed"); 20. } 21. }); Η μέθοδος showmessagedialog δημιουργεί ένα παράθυρο διάλογο με το κείμενο που περιέχει Μέχρι να πατηθεί το ΟΚ το πρόγραμμα σταματά. Μόλις πατηθεί πηγαίνει στην εντολή που δείχνει το βέλος. Δρ. Κεραμόπουλος Ευκλείδης 23
21. jfrm.add(jbtnshow); 22. jfrm.add(jlab); 23. jfrm.setvisible(true); 24. } 25. public static void main(string args[]) { 26. SwingUtilities.invokeLater(new Runnable() { 27. public void run() { 28. new MsgDialogDemo(); 29. } 30. }); 31. } 32. } Δρ. Κεραμόπουλος Ευκλείδης 24
Δρ. Κεραμόπουλος Ευκλείδης 25
1. import java.awt.*; 2. import java.awt.event.*; 3. import javax.swing.*; 4. class ConfirmDialogDemo { 5. JLabel jlab; 6. JButton jbtnshow; 7. JFrame jfrm; 8. ConfirmDialogDemo() { 9. jfrm = new JFrame("A Confirmation Dialog"); 10. jfrm.setlayout(new FlowLayout()); 11. jfrm.setsize(400, 250); 12. jfrm.setdefaultcloseoperation(jframe.exit_on_close); 13. jlab = new JLabel(); 14. jbtnshow = new JButton("Show Dialog"); Δρ. Κεραμόπουλος Ευκλείδης 26
15. jbtnshow.addactionlistener(new ActionListener() { 16. public void actionperformed(actionevent le) { 17. int response = JOptionPane.showConfirmDialog(jfrm, "Remove unused files?"); 18. switch(response) { 19. case JOptionPane.YES_OPTION: 20. jlab.settext("you answered Yes."); 21. break; 22. case JOptionPane.NO_OPTION: 23. jlab.settext("you answered No."); 24. break; 25. case JOptionPane.CANCEL_OPTION: 26. jlab.settext("cancel pressed."); 27. break; 28. case JOptionPane.CLOSED_OPTION: 29. jlab.settext("dialog closed without response."); 30. break; 31. } 32. } 33. }); Η μέθοδος showconfirmdialog δημιουργεί ένα παράθυρο διάλογο με το κείμενο που περιέχει και τρία κουμπιά YES, NO, CANCEL Δρ. Κεραμόπουλος Ευκλείδης 27
34. jfrm.add(jbtnshow); 35. jfrm.add(jlab); 36. jfrm.setvisible(true); 37. } 38. public static void main(string args[]) { 39. SwingUtilities.invokeLater(new Runnable() { 40. public void run() { 41. new ConfirmDialogDemo(); 42. } 43. }); 44. } 45. } Δρ. Κεραμόπουλος Ευκλείδης 28
Δρ. Κεραμόπουλος Ευκλείδης 29
1. import java.awt.*; 2. import java.awt.event.*; 3. import javax.swing.*; 4. class InputDialogDemo { 5. JLabel jlab; 6. JButton jbtnshow; 7. JFrame jfrm; 8. InputDialogDemo() { 9. jfrm = new JFrame("A Simple Input Dialog"); 10. jfrm.setlayout(new FlowLayout()); 11. jfrm.setsize(400, 250); 12. jfrm.setdefaultcloseoperation(jframe.exit_on_close); 13. jlab = new JLabel(); 14. jbtnshow = new JButton("Show Dialog"); Η μέθοδος showinputdialog δημιουργεί ένα παράθυρο διαλόγου το οποίο περιέχει ένα JTextFiled και δύο κουμπιά, τα ΟΚ και CANCEL. 15. jbtnshow.addactionlistener(new ActionListener() { 16. public void actionperformed(actionevent le) { 17. String response = JOptionPane.showInputDialog("Enter Name"); 18. if(response == null) 19. jlab.settext("dialog Cancelled or Closed"); 20. else if(response.length() == 0) 21. jlab.settext("no string entered"); 22. else 23. jlab.settext("hi there " + response); 24. } 25. }); Ανάλογα με το κείμενο που θα εισαχθεί και κουμπί που θα πατηθεί εμφανίζεται το αντίστοιχο μήνυμα. Δρ. Κεραμόπουλος Ευκλείδης 30
26. jfrm.add(jbtnshow); 27. jfrm.add(jlab); 28. jfrm.setvisible(true); 29. } 30. public static void main(string args[]) { 31. SwingUtilities.invokeLater(new Runnable() { 32. public void run() { 33. new InputDialogDemo(); 34. } 35. }); 36. } 37. } Δρ. Κεραμόπουλος Ευκλείδης 31
Δρ. Κεραμόπουλος Ευκλείδης 32
1. import java.awt.*; 2. import java.awt.event.*; 3. import javax.swing.*; 4. class OptionDialogDemo { 5. JLabel jlab; 6. JButton jbtnshow; 7. JFrame jfrm; 8. OptionDialogDemo() { 9. jfrm = new JFrame("A Simple Option Dialog"); 10. jfrm. setlayout(new FlowLayout()); 11. jfrm.setsize(400, 250); 12. jfrm.setdefaultcloseoperation(jframe.exit_on_close); 13. jlab = new JLabel(); 14. jbtnshow = new JButton("Show Dialog"); 15. jbtnshow.addactionlistener(new ActionListener() { 16. public void actionperformed(actionevent le) { 17. String[] connectopts = { "Modem", "Wireless", "Satelite", "Cable" }; 18. int response = JOptionPane.showOptionDialog( 19. jfrm, 20. "Choose One", 21. "Connection Type", 22. JOptionPane.DEFAULT_OPTION, 23. JOptionPane.QUESTION_MESSAGE, 24. null, 25. connectopts, 26. "Wireless"); Οι παράμετροι που περνάμε στο showoptiondialog είναι: (α) το συστατικό «πατέρας» ιεραρχικά του παραθύρου διαλόγου «jfrm», (β) το μήνυμα μέσα στο παράθυρο «Choose One», (γ) ο τίτλος του παράθυρου «Connection Type», (δ) ορίζεται κάποια συνηθισμένα κουμπιά YES_NO_OPTION και YES_NO_CANCEL_OPTION χρησιμοποιείται μόνο αν η ζ- παράμετρος είναι null (ε) ο τύπος της επιλογής το default είναι το QUESTION_MESSAGE. Οι άλλες επιλογές είναι ERROR, INFORMATION, PLAIN, WARNING MESSAGE, (στ) μία εικόνα, (ζ) οι τιμές των επιλογών, (η) η αρχική τιμή. Δρ. Κεραμόπουλος Ευκλείδης 33
27. switch(response) { 28. case 0: 29. jlab.settext("connect via modem."); break; 30. case 1: 31. jlab.settext("connect via wireless."); break; 32. case 2: 33. jlab.settext("connect via satelite."); break; 34. case 3: 35. jlab.settext("connect via cable."); break; 36. case JOptionPane.CLOSED_OPTION: 37. jlab.settext("dialog cancelled"); break; 38. } 39. } 40. }); 41. jfrm. add(jbtnshow); 42. jfrm. add(jlab); 43. jfrm.setvisible(true); 44. } 45. public static void main(string args[]) { 46. SwingUtilities.invokeLater(new Runnable() { 47. public void run() { 48. new OptionDialogDemo(); 49. } 50. }); 51. } 52. } Δρ. Κεραμόπουλος Ευκλείδης 34
Όταν το JOptionPane δεν καλύπτει τις επιλογές μας τότε χρησιμοποιούμε το JDialog. To JDialog είναι «βαρύ» συστατικό και μπορεί να χαρακτηριστεί αντίστοιχο του JFrame. Στο JDialog μπορούμε να τοποθετήσουμε οποιοδήποτε συστατικό. Για να εμφανίσουμε το JDialog χρησιμοποιούμε τη μέθοδο: setvisible(true) και για να το κρύψουμε τη μέθοδο setvisible(false). Επίσης, θα πρέπει να ορίσουμε και το μέγεθος του JDialog. Δρ. Κεραμόπουλος Ευκλείδης 35
Δρ. Κεραμόπουλος Ευκλείδης 36
1. import java.awt.*; 2. import java.awt.event.*; 3. import javax.swing.*; 4. class JDialogDemo { 5. JLabel jlab; 6. JButton jbtnshow; 7. JButton jbtnreset; 8. JButton jbtnup; 9. JButton jbtndown; 10. JDialog jdlg; Δήλωση ενός JDialog 11. JDialogDemo() { 12. JFrame jfrm = new JFrame("JDialog Demo"); 13. jfrm.setlayout(new FlowLayout()); 14. jfrm.setsize(400, 200); 15. jfrm.setdefaultcloseoperation(jframe.exit_on_close); 16. jlab = new JLabel("Direction is pending."); 17. jbtnshow = new JButton("Show Dialog"); 18. jbtnreset = new JButton("Reset Direction"); 19. jdlg = new JDialog(jfrm, "Direction", true); 20. jdlg.setsize(200, 100); 21. jdlg.setlayout(new FlowLayout()); Δημιουργία ενός JDialog, το οποίο συνδέεται με το jfrm, έχει τίτλο «Direction» και επίσης καθορίζεται ο τρόπος λειτουργίας του JDialog ως μονοτροπικού Ορισμός του μεγέθους του JDialog Ορισμός του layout του JDialog Δρ. Κεραμόπουλος Ευκλείδης 37
22. jbtnup = new JButton("Up"); 23. jbtndown = new JButton("Down"); 24. jdlg.add(jbtnup); 25. jdlg.add(jbtndown); 26. jdlg.add(new JLabel("Press a button.")); 27. jbtnshow.addactionlistener(new ActionListener() { 28. public void actionperformed(actionevent le) { 29. jdlg.setvisible(true); 30. } 31. }); Ενεργοποίηση του JDialog 32. jbtnreset.addactionlistener(new ActionListener() { 33. public void actionperformed(actionevent le) { 34. jlab.settext("direction is Pending."); 35. } 36. }); 37. jbtnup.addactionlistener(new ActionListener() { 38. public void actionperformed(actionevent le) { 39. jlab.settext("direction is Up"); 40. jdlg.setvisible(false); 41. } 42. }); Απενεργοποίηση του JDialog Δρ. Κεραμόπουλος Ευκλείδης 38
43. jbtndown.addactionlistener(new ActionListener() { 44. public void actionperformed(actionevent le) { 45. jlab.settext("direction is Down"); 46. jdlg.setvisible(false); 47. } 48. }); Απενεργοποίηση του JDialog 49. jfrm.add(jbtnshow); 50. jfrm.add(jbtnreset); 51. jfrm.add(jlab); 52. jfrm.setvisible(true); 53. } 54. public static void main(string args[]) { 55. SwingUtilities.invokeLater(new Runnable() { 56. public void run() { 57. new JDialogDemo(); 58. } 59. }); 60. } 61. } Δρ. Κεραμόπουλος Ευκλείδης 39