Both sides previous revisionPrevious revisionNext revision | Previous revision |
swing:jframe [2018/03/21 14:34] – [Η κλάση JFrame] gthanos | swing:jframe [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
---|
====== Η κλάση JFrame ====== | ====== Η κλάση JFrame ====== |
| |
H κλάση JFrame υλοποιεί το βασικό παράθυρο μιας εφαρμογής swing, όπως στο σχήμα. Το παράθυρο που ακολουθεί υλοποιείται από τον παρακάτω κώδικα: | H κλάση [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html|JFrame]] υλοποιεί το βασικό παράθυρο μιας εφαρμογής swing, όπως στο σχήμα. Το παράθυρο που ακολουθεί υλοποιείται από τον παρακάτω κώδικα: |
| |
<code java FrameDemo.java> | <code java FrameDemo.java> |
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); | frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); |
| |
// size window | // set window size |
frame.pack(); | frame.pack(); |
// show window | // show window |
</code> | </code> |
| |
=== Παρατηρήσεις === | === Παρατηρήσεις πάνω στον κώδικα === |
| |
- Η εκτέλεση του κώδικα που αφορά το παραθυρικό περιβάλλον //swing// γίνεται μέσα από την κλήση της στατικής μεθόδου [[https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable-|SwingUtilities.invokeLaber]], η οποία εκτελεί τον παραθυρικό κώδικα σε ένα νέο νήμα το **event dispatch thread** (νήμα αποστολής συμβάντων). | - Η εκτέλεση του κώδικα που αφορά το παραθυρικό περιβάλλον //swing// γίνεται μέσα από την κλήση της στατικής μεθόδου [[https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable-|SwingUtilities.invokeLaber]], η οποία εκτελεί τον παραθυρικό κώδικα σε ένα νέο νήμα το **event dispatch thread** (νήμα αποστολής συμβάντων). Αν και αυτό δεν είναι απαραίτητο για να τρέξει το πρόγραμμα σας, [[https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html|αποτελεί καλή πρακτική]], η οποία διαχωρίζει το συγκεκριμένο νήμα από άλλα νήματα που πιθανόν τρέχουν στην εφαρμογή σας. |
- H κλάση JFrame παράγει ένα αντικείμενο που αντιστοιχεί στο παράθυρο. | - H κλάση JFrame παράγει ένα αντικείμενο που αντιστοιχεί στο παράθυρο. Η παράμετρος τύπου String στον κατασκευαστή αντιστοιχεί στον τίτλο που θα φέρει το παράθυρο. |
| - Η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation-int-|JFrame.setDefaultCloseOperation(int operation)]] ορίζει τι θα γίνει όταν ο χρήστης πατήσει το κουμπί (επάνω δεξιά) που κλείνει το παράθυρο. Η μεταβλητή ''operation'' μπορεί να πάρει μία από τις παρακάτω τιμές: |
===== Βασικές μέθοδοι της κλάσης JFrame ===== | |
| |
Οι βασικές μέθοδοι της κλάσης JFrame είναι οι παρακάτω: | |
* ''public JFrame()'': default κατασκευαστής του παραθύρου. | |
* ''public JFrame(String title)'': Κατασκευαστής του παραθύρου στον οποίο ορίζεται και ο τίτλος. | |
* ''public void setTitle(String title)'': Ορισμός του τίτλου του παραθύρου. | |
* ''public void setSize(int width, int height)'': Ορισμός του μεγέθους του παραθύρου σε pixels. | |
* ''public void add(Component componentToAdd)'': Προσθέτει ένα γραφικό component στο παράθυρο. | |
* ''public void setLayout(LayoutManager manager)'': Ορίζει το layout για το παράθυρο. Θα δούμε πιο κάτω τι είναι το layout και θα δούμε επίσης τα πιο ενδιαφέροντα layouts. | |
* ''public void setMenuBar(JMenuBar menubar)'': Ορίζει την μπάρα για το μενού στο παράθυρο. | |
* ''public void setDefaultCloseOPeration(int operation)'': Ορίζει την διαδικασία που θα τρέξει όταν ο χρήστης πατήσει το κουμπί (επάνω δεξιά) που κλείνει το παράθυρο. Η μεταβλητή ''operation'' μπορεί να πάρει μία από τις παρακάτω τιμές: | |
* JFrame.**DO_NOTHING_ON_CLOSE**: Δεν κάνει τίποτα. Αν υπάρχουν ορισμένοι window listeners αυτοί εκτελούνται. | * JFrame.**DO_NOTHING_ON_CLOSE**: Δεν κάνει τίποτα. Αν υπάρχουν ορισμένοι window listeners αυτοί εκτελούνται. |
* JFrame.**HIDE_ON_CLOSE**: Κρύβει το παράθυρο αφού εκτελέσει πιθανώς ορισμένους window listeners. Το παράθυρο δεν είναι δυνατόν να ανακτηθεί, αλλά η εφαρμοργή δεν τερματίζεται. Η παραπάνω τιμή είναι η **default** αν δεν έχει οριστεί κάποια άλλη. | * JFrame.**HIDE_ON_CLOSE**: Κρύβει το παράθυρο αφού εκτελέσει πιθανώς ορισμένους window listeners. Το παράθυρο δεν είναι δυνατόν να ανακτηθεί, αλλά η εφαρμογή δεν τερματίζεται. Η παραπάνω τιμή είναι η **default** αν δεν έχει οριστεί κάποια άλλη. |
* JFrame.**DISPOSE_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο. Αν υπάρχουν και άλλα παράθυρα αυτά παραμένουν, ενώ αν δεν υπάρχουν τερματίζει η εφαρμογή. | * JFrame.**DISPOSE_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο. Αν υπάρχουν και άλλα παράθυρα αυτά παραμένουν, ενώ αν δεν υπάρχουν τερματίζει η εφαρμογή. |
* JFrame.**EXIT_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο και συνολικά την εφαμοργή (αν υπάρχουν και άλλα παράθυρα τερματίζουν και αυτά). | * JFrame.**EXIT_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο και συνολικά την εφαρμογή (αν υπάρχουν και άλλα παράθυρα τερματίζουν και αυτά). |
| - Η μέθοδος JFrame.pack υπολογίζει το μέγεθος του παραθύρου. |
| - Η μέθοδος JFrame.setVisible(boolean value) κάνει το παράθυρο ορατό προς τον τελικό χρήστη. |
| |
<WRAP tip 80% center round> | <WRAP tip 80% center round> |
Η μέθοδος ''w.setVisible(true)'', ορίζει ότι το παράθυρο θα είναι ορατό. Αν ορίσετε ''w.setVisible(false)'', τότε το παράθυρο δεν εμφανίζεται και το πρόγραμμα τερματίζεται μόλις αρχίσει η εκτέλεση του. | Η μέθοδος **w.setVisible(true)**, ορίζει ότι το παράθυρο θα είναι ορατό. Αν ορίσετε **w.setVisible(false)**, τότε το παράθυρο δεν εμφανίζεται και το πρόγραμμα τερματίζεται μόλις αρχίσει η εκτέλεση του. |
</WRAP> | </WRAP> |
| |
| ===== Δομικά στοιχεία ενός JFrame ===== |
| |
| Από τι αποτελείται όμως ένα αντικείμενο της κλάσης [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html|JFrame]]; Στην πραγματικότητα ένα **JFrame** είναι ένα αντικείμενο που χρησιμοποιεί τα hooks του λειτουργικού συστήματος και του window manager για να δημιουργήσει ένα παράθυρο. Ένα **JFrame** περιέχει ένα αντικείμενο της κλάσης [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JRootPane.html|JRootPane]], το οποίο με τη σειρά του περιέχει οτιδήποτε συνδέεται με το περιεχόμενο του παραθύρου. Πιο συγκεκριμένα ένα [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JRootPane.html|JRootPane]] περιέχει με τη σειρά του τα εξής: |
| - ένα αντικείμενο της κλάσης [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JLayeredPane.html|JLayeredPane]] το οποίο έχει την δυνατότητα να προσδίδει βάθος στα αντικείμενα που περιέχονται στο παράθυρο. Δεν θα ασχοληθούμε περαιτέρω με τη συγκεκριμένη κλάση, καθώς έχει ειδικές εφαρμογές. Μπορείτε να δείτε το σχετικό [[https://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html|παράδειγμα από το site της Oracle]]. |
| - ένα //content pane//, δηλαδή ο χώρος στον οποίο θα τοποθετηθεί το περιεχόμενο του παραθύρου. Συνήθως τοποθετείται σε αυτό ένα αντικείμενο της κλάσης [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JPanel.html|JPanel]]. |
| - ένα [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JMenuBar.html|menu]] που τοποθετείται ακριβώς πάνω από το //content pane//. |
| - ένα //component// που ονομάζεται Glass Pane και τοποθετείται πάνω από το [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JLayeredPane.html|JLayeredPane]], προκειμένου να πιάσει με τη βοήθεια του ποντικιού events πάνω από άλλα αντικείμενα. Και αυτό δεν θα μας απασχολήσει στη συνέχεια, καθώς έχει ειδικές εφαρμογές. |
| |
| Το παρακάτω σχήμα από το [[https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html#rootpane|site της Oracle]] δίνει εποπτικά την παραπάνω διάκριση των περιεχομένων του [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JRootPane.html|JRootPane]]. Δεν θα ασχοληθούμε περαιτέρω με την κλάση **JRootPane**, αλλά θα επικεντρωθούμε στο //content pane// και το //menu bar// που αυτό περιέχει (στοιχεία 2 και 3 από την παραπάνω λίστα). |
| |
| {{ :swing:ui-rootpane.gif |}} |
| |
| ===== Βασικές μέθοδοι της κλάσης JFrame ===== |
| |
| Η κλάση **JFrame** έχει τους εξής κατασκευαστές: |
| * **public JFrame()**: default κατασκευαστής του παραθύρου. |
| * **public JFrame(String title)**: Κατασκευαστής του παραθύρου στον οποίο ορίζεται και ο τίτλος. |
| |
| και τις παρακάτω μεθόδους |
| |
| **α)** σχετικά με το μέγεθος του παραθύρου: |
| * **public void setSize(int width, int height)**: Ορισμός του μεγέθους του παραθύρου σε pixels. |
| * **void setSize(int width, int height):** Ορισμός του μεγέθους του παραθύρου σε pixels. |
| * **void setBound(int x, int y, int width, int height):** Ορίζει τη θέση του παραθύρου στην οθόνη και το μέγεθος του παραθύρου κατά τη δημιουργία του. |
| **β)** Σχετικά με το περιεχόμενο του παραθύρου: |
| * **void setContentPane(Container):** Θέτει το //content pane// του παραθύρου. |
| * **Container getContentPane():** Λαμβάνει το //content pane// του παραθύρου. |
| * **public void add(Component componentToAdd)**: Προσθέτει ένα γραφικό //component// στο //content pane// του παραθύρου. |
| * **public void setLayout(LayoutManager manager)**: Ορίζει το layout για το παράθυρο. Θα δούμε πιο κάτω τι είναι το layout και θα δούμε επίσης τα πιο ενδιαφέροντα layouts. |
| * **public void setMenuBar(JMenuBar menubar)**: Ορίζει το αντικείμενο της μπάρας για το μενού στο παράθυρο. |
| * **public void setDefaultCloseOPeration(int operation)**: Αναφέρθηκε προηγούμενα. |
| |
| | Προηγούμενο: [[:swing:events | Events & Event Listeners ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:swing:color | Η κλάση JColor ]] | |
| |