ΑΛΛΗΛΕΠΙ ΡΑΣΗ ΑΝΘΡΩΠΟΥ ΜΗΧΑΝΗΣ 9 o ΕΡΓΑΣΤΗΡΙO H φόρµα µε τίτλο «Simple Editor» θα έχει δυνατότητα ανάγνωσης και αποθήκευσης ενός απλού text αρχείου χρησιµοποιώντας Μενού και FileChooser αντί διαλόγων. jτextarea (Προτείνεται να κάνετε copy το project του Eργ 8 για να το αλλάξετε σε Eργ9) Λειτουργικά θα αντικαταστήσετε τους 2 πρώτους διαλόγους του Eργ 8 (κρατήστε τον 3 ο ), με 2 FileChooser, και θα ισχύουν πάλι οι λειτουργίες Open/Save και SaveAs. Mην βιαστείτε να σβύσετε τους 2 διαλόγους. Το καλύτερο θα ήταν να εχουμε τις εντολές ανάγνωσης και εγγραφής αρχείου, μέσα σε μεθόδους και να τις καλούμε στα σημεία που απαιτείται. Η διαφοροποίηση των 3 εργαστηρίων (7 ο, 8 ο και 9 ο ) αφορά και τον τρόπο με το οποίο επιλέγεται το αρχείο π.χ. το όνομα του αρχείου (fname) δίνεται άμεσα μέσα σε TextField, ή σε TextField ενός διαλόγου ή επιλέγεται μέσω FileChooser. fname =jfilechooser1.getselectedfile().getabsolutepath(); (Προτείνεται να υλοποιηθούν δυο μέθοδοι openfile και savefile ) Aπό τον 1 ο διάλογο: Αδειάσετε την μέθοδο του κουμπιού Οpen του διαλόγου private void jbutton1actionperformed(java.awt.event.actionevent evt) { και το περιεχόμενό της να το μεταφέρετε σε μέθοδο με όνομα openfile private void openfile() { try { catch (IOException e) { // open FILE... με FILEREADER Από τον 2 ο διάλογο: Αδειάσετε την μέθοδο του κουμπιού Save του διαλόγου private void jbutton3actionperformed(java.awt.event.actionevent evt) { και το περιεχόμενό της μεταφέρετέ το σε μέθοδο με όνομα savefile private void savefile() { /*save FILE... με FILEWRITER */ Κατόπιν σβύστε τους 2 διαλόγους και ότι εντολή τους αφορά. Tα υπόλοιπα παραμένουν όπως ήταν στο Eργ 8. Επι πλέον θα προστεθούν διάφορα μηνύματα είτε λάθους είτε πληροφοριακά (μέσω OptionPane). VK -09/12/2016 -[1]
OptionPane Παράθυρα Που θα τα χρησιμοποιήσετε: η αποθήκευση των αλλαγών θα γίνεται αφού ερωτηθεί ο χρήστης αν θέλει να αποθηκεύσει ή όχι. Η ερώτηση θα γίνει μέσω διαλόγου joptionpane (βιβλιοθήκη import javax.swing.joptionpane; ). Eτσι στα SAVE του μενού, πριν γίνει η διαδικασία εγγραφής, θα ανοίγει OptionPane και θα ελέγχονται τα αποτελέσματά του π.χ. int result; result = joptionpane1.showconfirmdialog(this, "The file exists,overwrite?", "Existing file", JOptionPane.YES_NO_CANCEL_OPTION); Το OptionPane ανοίγει με showconfirmdialog και επιστρέφει μια ακέραια τιμή result H κλάση JOptionPane δημιουργεί έτοιμα παράθυρα διαλόγου διαφόρων ειδών πχ: Ενημερωτικά: joptionpane1.showμessagedialog Eπιβεβαιωτικά: joptionpane1.showconfirmdialog Eισαγωγής: joptionpane1.showιnputdialog Επιλογής: joptionpane1.showoptiondialog ΕΝΗΜΕΡΩΤΙΚΟ ΕΠΙΒΕΒΑΙΩΤΙΚΟ Μπορείτε να Προσθέστε joptionpane και µέσω των ΟtherComponents -1: CLOSE_OPTION, DEFAULT_OPTION 0 : OK_OPTION, YES_OPTION, YES_NO_OPTION 1 : NO_OPTION, YES_NO_CANCEL_OPTION 2 : CANCEL_OPTION, OK_ CANCEL_OPTION JOptionPane.showMessageDialog (null, "Το μήνυμά μου!", "Tίτλος μηνύματος", JOptionPane.ERROR_MESSAGE); joptionpane1.showconfirmdialog (this, "The file exists,overwrite?", "Existing file", JOptionPane.YES_NO_CANCEL_OPTION); EIΣΑΓΩΓΗΣ ΕΠΙΛΟΓΗΣ JOptionPane.showInputDialog (null, "Δώσε όνομα","tίτλος μηνύματος", JOptionPane.OK_CANCEL_OPTION); String[] epiloges = { "Καθηγητής","Μαθητής","Επισκέπτης"; VK -09/12/2016 -[2]
JOptionPane.showOptionDialog (null, "Διάλεξε", "Tίτλος μηνύματος", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, epiloges, "Μαθητής"); Eδώ θα χρησιμοποιήσουμε μόνο τα 2 πρώτα παράθυρα (Message και Confirm). 1. Λειτουργία ΟPEN/read του μενού (για text αρχείο ) Προσθέστε τον 1 ο FileChooser µέσω των ΟtherComponents FileReader fr=new FileReader(fName); jtextarea1.read(fr,null); fr.close(); ΥΠΕΝΘΥΜΙΣΗ Ανάγνωσης (μέσα σε try/catch μπλοκ) openfile //ονομα αρχείου fname Προσθέστε τον 1 ο FileChooser μέσω των ΟtherComponents/Αdd From Palette/Swing Windows Με την επιλογή ΟPEN του μενού θα ανοίγει o FileChooser με την μέθοδο jfilechooser1.showopendialog και αφού επιλεχθεί το επιθυμητό (txt) αρχείο, με το κουμπί του Οpen το κείμενο του αρχείου θα εμφανίζεται μέσα στην jtextarea1 (και ο FileChooser κλείνει - αυτόματα). Οταν πατιέται το κουμπί του Cancel απλά κλείνει (θα μπουν και κάποια μηνυματάκια μετά). Ο FileChooser (για open) ανοίγει με showopendialog και επιστρέφει μια ακέραια τιμή 1 Αν όλα ΟΚ (δηλ. retok=0), θα αρχικοποιηθεί o FileReader, με όνομα αρχείου (fname) int retok; //η τιμή επιστροφής από το άνοιγμα του FileChooser private void jmenuitem1actionperformed(java.awt.event.actionevent evt) { retok =jfilechooser1.showopendialog(this); if (retok == JFileChooser.APPROVE_OPTION) // retok=0 { fname =jfilechooser1.getselectedfile().getabsolutepath(); settitle(fname) ; openfile() ; -1 : ERROR_OPTION 0 : APPROVE_OPTION 1 : CANCEL_OPTION Για να δημιουργήστε φίλτρο στον διάλογο, για τα επιλεγόμενα αρχεία π.χ. για αρχεία κειμένου : FileNameExtensionFilter filter =new FileNameExtensionFilter("TEXT Files", "txt"); jfilechooser1.setfilefilter(filter); (απαιτεί την βιβλιοθήκη import javax.swing.filechooser.filenameextensionfilter; Τις δυο αυτές εντολές, μπορείτε να τις βάλετε πχ. στο δομητή της κλάσης μετά το initcomponents()). 1 https://docs.oracle.com/javase/7/docs/api/constant-values.html#javax.swing //οι σταθερές javax.swing.jfilechooser VK -09/12/2016 -[3]
2. Λειτουργίες SAVE και SAVE as /write του μενού Την μέθοδο savefile, θα την καλέσετε και στις 2 λειτουργίες (save και saveas) Το όνομα του αρχείου που θα σωθεί, θα βρίσκεται στην μεταβλητή fname. Λειτουργία SAVE του μενού int result; private void jmenuitem3actionperformed(java.awt.event.actionevent evt) { result = joptionpane1.showconfirmdialog(this, "Θέλεις να κρατήσεις τις αλλαγές?", "ΑΠΟΘΗΚΕΥΣΗ", JOptionPane.YES_NO_CANCEL_OPTION); if (result== JOptionPane.YES_OPTION) savefile(); savefile Λειτουργία SAVEas του μενού Θα χρησιμοποιηθεί ένας ακόμη FileChooser ώστε να επιλεχθεί η τοποθεσία που θα σωθεί το αρχείο και να δοθεί το νέο όνομα. Ο 2 ος FileChooser θα ανοίγει με showsavedialog, και θα επιστρέφει την ακέραια τιμή retok. Υπενθύμιση Αποθήκευσης (μέσα σε try/catch μπλοκ) FileWriter fw=new FileWriter(fName); jtextarea1.write(fw); fw.close(); Προσθέστε τον 2 ο FileChooser µέσω των ΟtherComponents Εδώ θα μπει το νέο όνομα. Κουμπιά: Save και το Cancel private void jmenuitem4actionperformed(java.awt.event.actionevent evt) { retok = jfilechooser2.showsavedialog(this); Αν όλα ΟΚ, θα πρεπει να αρχικοποιηθεί ο FileWriter με το όνομα που επιλέγεται στο 2 ο FileChooser Έτσι όταν πατιέται το κουμπί του Save, το κείμενο που υπάρχει μέσα στην jtextarea1 θα σώζεται στο νέο επιλεγμένο όνομα και θα κλείνει ο διάλογος και όταν πατιέται το κουμπί Cancel απλά κλείνει ο διάλογος (αυτόματα). Οι λειτουργίες του jfilechooser2 μπορούν να ελεγχούν και με ActionPerformed: VK -09/12/2016 -[4]
private void jfilechooser2actionperformed(java.awt.event.actionevent evt) { if (retok ==JFileChooser.APPROVE_OPTION) { fname = jfilechooser2.getselectedfile().getabsolutepath() ; //εδώ.., θα πρέπει να ελεγχτεί μήπως ΥΠΑΡΧΕΙ ΗΔΗ ΤΟ ΑΡΧΕΙΟ //και αν το αρχείο υπάρχει, να ερωτηθεί ο χρήστης αν θέλει να το επικαλύψει savefile(); Στο SaveΑs του μενού, πρέπει να ελεγχτεί μήπως υπάρχει ήδη αρχείο με το όνομα που δόθηκε, και αν υπάρχει να εμφανιστεί joptionpane διάλογος ώστε να ερωτηθεί ο χρήστης αν επιθυμεί αντικατάστασή του. Για να ελέγξετε αν υπάρχει ήδη το όνομα του αρχείου που δώσατε, θα χρησιμοποιήσετε ένα αντικείμενο filename της τάξης File File fo; //μεταβλητή, απαιτεί βιβλιοθήκη: import java.io.file; fo= jfilechooser2.getselectedfile() //το αρχείο, ως αντικείμενο της κλάσης File fname=fo. getabsolutepath(); if ( fo.exists() ) Αφού ρωτήσεις με joptionpane αν επιθυμείτaι αντικατάσταση και είναι ΟΚ, σώσε. Αν δεν υπάρχει πάλι θα σώσεις (χωρίς όμως να ρωτήσεις ). Μηνύματα για πληροφορίες και λάθη, με δημιουργία μεθόδων Θα δημιουργήστε 2 μεθόδους: errormessage και infomessage με παράμετρο το κείμενο, ώστε να τις καλείτε σε διάφορα σημεία του κώδικα με διαφορετικό μήνυμα (βλέπε πιο κάτω.) Μήνυμα Τίτλος private void errormessage(string msg) { JOptionPane.showMessageDialog(null, msg,"προσοχή Λάθος",JOptionPane.ERROR_MESSAGE); private void infomessage(string msg) { JOptionPane.showMessageDialog(null, msg,"ενημέρωση",joptionpane.information_message); Εμφανίστε Ενημερωτικά Μηνύματα και Μηνύματα Λάθους όπου αυτό απαιτείται χρησιμοποιώντας το δικό σας κείμενο π.χ. Όταν πατάω το Οpen του 1 ου FileChooser και δίνω όνομα αρχείου που δεν υπάρχει θα καλείται η errormessage("δεν υπάρχει αυτό το αρχείο ") Όταν πατάω το Οpen του 1 ου FileChooser χωρίς να επιλέγω όνομα αρχείου καλείται η errormessage("δεν υπάρχει αυτό το αρχείο ") Όταν εμφανίζεται το αρχείο στην TextArea να καλείται η infomessage("το αρχείο φορτώθηκε σωστά ") Όταν πατάω το Cancel του 1 ου FileChooser να καλείται η infomessage("πάτησες Cancel ") Όταν πατάω το Cancel του 2 ου FileChooser και δεν δίνω όνομα αρχείου θα καλείται η infomessage("πάτησες Cancel ") κτλ. VK -09/12/2016 -[5]