| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
swing:jframe [2018/03/21 15:07] gthanos |
swing:jframe [2021/04/13 05:33] |
| ====== Η κλάση JFrame ====== | |
| |
| H κλάση JFrame υλοποιεί το βασικό παράθυρο μιας εφαρμογής swing, όπως στο σχήμα. Το παράθυρο που ακολουθεί υλοποιείται από τον παρακάτω κώδικα: | |
| |
| <code java FrameDemo.java> | |
| import java.awt.*; | |
| import java.awt.event.*; | |
| import javax.swing.*; | |
| |
| public class FrameDemo { | |
| |
| private static void createAndShowGUI() { | |
| //Create and set up the window. | |
| JFrame frame = new JFrame("FrameDemo"); | |
| frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
| |
| JLabel emptyLabel = new JLabel(""); | |
| emptyLabel.setPreferredSize(new Dimension(200, 130)); | |
| frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); | |
| |
| // set window size | |
| frame.pack(); | |
| // show window | |
| frame.setVisible(true); | |
| } | |
| |
| public static void main(String[] args) { | |
| //Schedule a job for the event-dispatching thread: | |
| //creating and showing this application's GUI. | |
| javax.swing.SwingUtilities.invokeLater(new Runnable() { | |
| public void run() { | |
| createAndShowGUI(); | |
| } | |
| }); | |
| } | |
| } | |
| </code> | |
| |
| === Παρατηρήσεις πάνω στον κώδικα === | |
| |
| - Η εκτέλεση του κώδικα που αφορά το παραθυρικό περιβάλλον //swing// γίνεται μέσα από την κλήση της στατικής μεθόδου [[https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable-|SwingUtilities.invokeLaber]], η οποία εκτελεί τον παραθυρικό κώδικα σε ένα νέο νήμα το **event dispatch thread** (νήμα αποστολής συμβάντων). | |
| - H κλάση JFrame παράγει ένα αντικείμενο που αντιστοιχεί στο παράθυρο. Η παράμετρος τύπου String στον κατασκευαστή αντιστοιχεί στον τίτλο που θα φέρει το παράθυρο. | |
| - Η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation-int-|JFrame.setDefaultCloseOPeration(int operation)]] ορίζει τι θα γίνει όταν ο χρήστης πατήσει το κουμπί (επάνω δεξιά) που κλείνει το παράθυρο. Η μεταβλητή ''operation'' μπορεί να πάρει μία από τις παρακάτω τιμές: | |
| * JFrame.**DO_NOTHING_ON_CLOSE**: Δεν κάνει τίποτα. Αν υπάρχουν ορισμένοι window listeners αυτοί εκτελούνται. | |
| * JFrame.**HIDE_ON_CLOSE**: Κρύβει το παράθυρο αφού εκτελέσει πιθανώς ορισμένους window listeners. Το παράθυρο δεν είναι δυνατόν να ανακτηθεί, αλλά η εφαρμογή δεν τερματίζεται. Η παραπάνω τιμή είναι η **default** αν δεν έχει οριστεί κάποια άλλη. | |
| * JFrame.**DISPOSE_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο. Αν υπάρχουν και άλλα παράθυρα αυτά παραμένουν, ενώ αν δεν υπάρχουν τερματίζει η εφαρμογή. | |
| * JFrame.**EXIT_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο και συνολικά την εφαρμογή (αν υπάρχουν και άλλα παράθυρα τερματίζουν και αυτά). | |
| - Η μέθοδος JFrame.pack υπολογίζει το μέγεθος του παραθύρου. | |
| - Η μέθοδος JFrame.setVisible(boolean value) κάνει το παράθυρο ορατό προς τον τελικό χρήστη. | |
| |
| ===== Δομικά στοιχεία ενός JFrame ===== | |
| |
| Από τι αποτελείται όμως ένα αντικείμενο της κλάσης 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]] το οποίο έχει την δυνατότητα να προσδίδει βάθος στα αντικείμενα που περιέχονται στο παράθυρο. | |
| - ένα //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]]{{:swing:ui-rootpane.gif|}} που τοποθετείται ακριβώς πάνω από το //content pane//. | |
| - ένα //component// που ονομάζεται Glass Pane και τοποθετείται πάνω από το JLayeredPane. | |
| |
| Το παρακάτω σχήμα από το [[https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html#rootpane|site της Oracle]] δίνει εποπτικά την παραπάνω διάκριση των περιεχομένων του JRootPane. | |
| |
| {{:swing:ui-rootpane.gif|}} | |
| |
| ===== Βασικές μέθοδοι της κλάσης 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.**HIDE_ON_CLOSE**: Κρύβει το παράθυρο αφού εκτελέσει πιθανώς ορισμένους window listeners. Το παράθυρο δεν είναι δυνατόν να ανακτηθεί, αλλά η εφαρμοργή δεν τερματίζεται. Η παραπάνω τιμή είναι η **default** αν δεν έχει οριστεί κάποια άλλη. | |
| * JFrame.**DISPOSE_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο. Αν υπάρχουν και άλλα παράθυρα αυτά παραμένουν, ενώ αν δεν υπάρχουν τερματίζει η εφαρμογή. | |
| * JFrame.**EXIT_ON_CLOSE**: Τερματίζει το τρέχον παράθυρο και συνολικά την εφαμοργή (αν υπάρχουν και άλλα παράθυρα τερματίζουν και αυτά). | |
| |
| <WRAP tip 80% center round> | |
| Η μέθοδος ''w.setVisible(true)'', ορίζει ότι το παράθυρο θα είναι ορατό. Αν ορίσετε ''w.setVisible(false)'', τότε το παράθυρο δεν εμφανίζεται και το πρόγραμμα τερματίζεται μόλις αρχίσει η εκτέλεση του. | |
| </WRAP> | |
| |
| |