swing:intro
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
swing:intro [2018/03/19 14:57] – [Events και Listeners] gthanos | swing:intro [2020/03/16 10:45] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Δημιουργία παραθυρικών εφαρμογών με Swing ====== | ====== Δημιουργία παραθυρικών εφαρμογών με Swing ====== | ||
- | Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης **Swing**. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που χρησιμοποιούν την κονσόλα για είσοδο και έξοδο, με την έννοια ότι δεν υφίσταται μία συνεχής ροή προγράμματος, | + | Σε αυτή την ενότητα θα δούμε πως μπορούμε να κατασκευάσουμε παραθυρικές εφαρμογές (Graphical User Interfaces, GUIs) με χρήση της βιβλιοθήκης **Swing**. Οι παραθυρικές εφαρμογές είναι διαφορετικές από τις εφαρμογές που χρησιμοποιούν την κονσόλα για είσοδο και έξοδο, με την έννοια ότι δεν υφίσταται μία συνεχής ροή προγράμματος, |
- | ===== Events | + | Το παρακάτω σχήμα **Α** δείχνει το παράδειγμα μίας εφαρμογής swing που αποτελείται από μόνο ένα κουμπί (button). O χρήστης κάθε φορά που πατά το κουμπί με το ποντίκι (αριστερό click) δημιουργείται ένα event του τύπου ActionEvent. To event μπορούμε να επιλέξουμε να το διαχειριστούμε μέσα από ένα αντικείμενο του τύπου //event listener//, το οποίο παρέχει τον κώδικα που θα εκτελεστεί για το event αυτό. Στο σχήμα **Β** δίνεται εποπτικά η διαδικασία δημιουργίας αλλά και διαχείρισης του event από τον //event listener//. |
- | Το γραφικό περιβάλλον μίας εφαρμογής αποτελείται από αντικείμενα που αντιπροσωπεύουν οντότητες με τις οποίες ο χρήστης μπορεί να αλληλεπιδράσει. Παραδείγματα, | + | ^Α. Παράδειγμα γραφικού περιβάλλοντος |
- | + | |{{ : | |
- | Όταν ο χρήστης πατήσει ένα πλήκτρο από το πληκτρολόγιο ή μετακινήσει το ποντίκι, | + | |
- | + | ||
- | Ο **//window manager// | + | |
- | + | ||
- | Θα πρέπει να τονίσουμε | + | |
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
- | Βασικό χαρακτηριστικό του event driven προγραμματισμού είναι ότι δημιουργούμε αντικείμενα και μεθόδους (event listeners) τα οποία δεν γνωρίζουμε αν θα κληθούν και με ποια σειρά θα κληθούν, | + | Βασικό χαρακτηριστικό του event driven προγραμματισμού είναι ότι δημιουργούμε αντικείμενα και μεθόδους (event listeners) τα οποία δεν γνωρίζουμε αν θα κληθούν και με ποια σειρά θα κληθούν, |
</ | </ | ||
- | Το παρακάτω σχήμα δείχνει εποπτικά | + | Το γραφικό περιβάλλον |
- | {{:swing:swingeventhandlingprocess.png|}} | + | {{ :swing:swingcalculator.png?200 |}} |
- | ===== Το πρώτο μου πρόγραμμα | + | | Προηγούμενο: |
- | Παρακάτω φτιάχνουμε ένα πρώτο απλό παραθυρικό πρόγραμμα το οποίο έχει μόνο ένα κουμπί που τερματίζει την εφαρμογή. Κατεβάστε και τρέξτε τα επόμενα δύο αρχεία. | ||
- | |||
- | <code java FirstWindow.java> | ||
- | import javax.swing.JFrame; | ||
- | import javax.swing.JButton; | ||
- | |||
- | public class FirstWindow { | ||
- | public static final int WIDTH = 300; | ||
- | public static final int HEIGHT = 200; | ||
- | | ||
- | public static void showGUI() { | ||
- | JFrame firstWindow = new JFrame(); | ||
- | firstWindow.setSize(WIDTH, | ||
- | firstWindow.setTitle(" | ||
- | firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); | ||
- | JButton endButton = new JButton(" | ||
- | EndingListener buttonEar = new EndingListener(); | ||
- | endButton.addActionListener(buttonEar); | ||
- | firstWindow.add(endButton); | ||
- | firstWindow.setVisible(true); | ||
- | } | ||
- | | ||
- | public static void main(String[] args) { | ||
- | javax.swing.SwingUtilities.invokeLater(new Runnable() { | ||
- | public void run() { | ||
- | showGUI(); | ||
- | } | ||
- | }); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | <code java EndingListener.java> | ||
- | import java.awt.event.*; | ||
- | |||
- | public class EndingListener implements ActionListener { | ||
- | public void actionPerformed(ActionEvent e) { | ||
- | System.exit(0); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Ας εξετάσουμε όμως τι κάνει το πρόγραμμα μας. Αρχικά δημιουργούμε ένα αντικείμενο του τύπου //JFrame// μέσα από την κλήση. | ||
- | <code java> | ||
- | JFrame firstWindow = new JFrame(); | ||
- | </ | ||
- | Το αντικείμενο αυτό είναι ένα απλό παράθυρο με τρία κουμπιά (minimize, resize, close). Στη συνέχεια ορίζουμε το μέγεθος του παραθύρου (σε pixels) και τον τίτλο του. | ||
- | <code java> | ||
- | firstWindow.setSize(WIDTH, | ||
- | firstWindow.setTitle(" | ||
- | </ | ||
- | Από την εμπειρία σας γνωρίζετε ότι όταν πατήσετε το κουμπί για το κλείσιμο του παραθύρου τότε το παράθυρο κλείνει και η εφαρμογή τερματίζεται. Η παρακάτω γραμμή διαχειρίζεται διαφορετικά ένα click event στο κουμπί κλεισίματος του παραθύρου, | ||
- | <code java> | ||
- | firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); | ||
- | </ | ||
- | |||
- | Στην συνέχεια ορίζουμε ένα αντικείμενο τύπου JButton (κουμπί) με τίτλο "Click to end program." | ||
- | <code java> | ||
- | JButton endButton = new JButton(" | ||
- | EndingListener buttonEar = new EndingListener(); | ||
- | endButton.addActionListener(buttonEar); | ||
- | </ | ||
- | |||
- | Προσθέτουμε το κουμπί στο παράθυρο και ορίζουμε ότι το παράθυρο που φτιάξαμε θέλουμε να είναι ορατό. | ||
- | <code java> | ||
- | firstWindow.add(endButton); | ||
- | firstWindow.setVisible(true); | ||
- | </ | ||
- | ==== Χρήση μίας ανώνυμης κλάσης ActionListener ==== | ||
- | |||
- | Για να μην έχουμε πολλαπλά αρχεία, | ||
- | |||
- | <code java FirstSwingDemo2.java> | ||
- | import javax.swing.JFrame; | ||
- | import javax.swing.JButton; | ||
- | import java.awt.event.*; | ||
- | |||
- | public class FirstSwingDemo2 { | ||
- | public static final int WIDTH = 300; | ||
- | public static final int HEIGHT = 200; | ||
- | | ||
- | public static void showGUI() { | ||
- | JFrame firstWindow = new JFrame(); | ||
- | firstWindow.setSize(WIDTH, | ||
- | firstWindow.setTitle(" | ||
- | firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); | ||
- | JButton endButton = new JButton(" | ||
- | | ||
- | ActionListener buttonEar = new ActionListener() { | ||
- | public void actionPerformed(ActionEvent e) { | ||
- | System.exit(0); | ||
- | } | ||
- | }; | ||
- | | ||
- | endButton.addActionListener(buttonEar); | ||
- | firstWindow.add(endButton); | ||
- | firstWindow.setVisible(true); | ||
- | } | ||
- | | ||
- | public static void main(String[] args) { | ||
- | javax.swing.SwingUtilities.invokeLater(new Runnable() { | ||
- | public void run() { | ||
- | showGUI(); | ||
- | } | ||
- | }); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Το παραπάνω παράθυρο ως αυτόνομη κλάση ==== | ||
- | |||
- | Αν θέλατε να δημιουργήσετε μία κλάση που να υλοποιεί το συγκεκριμένο παράθυρο, | ||
- | |||
- | <code java FirstWindow.java> | ||
- | import javax.swing.JFrame; | ||
- | import javax.swing.JButton; | ||
- | import java.awt.event.*; | ||
- | |||
- | public class FirstWindow extends JFrame { | ||
- | public static final int WIDTH = 300; | ||
- | public static final int HEIGHT = 200; | ||
- | | ||
- | public static void showGUI() { | ||
- | JFrame firstWindow = new JFrame(); | ||
- | firstWindow.setSize(WIDTH, | ||
- | firstWindow.setTitle(" | ||
- | firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); | ||
- | JButton endButton = new JButton(" | ||
- | ActionListener buttonEar = new ActionListener() { | ||
- | public void actionPerformed(ActionEvent e) { | ||
- | System.exit(0); | ||
- | } | ||
- | }; | ||
- | endButton.addActionListener(buttonEar); | ||
- | firstWindow.add(endButton); | ||
- | firstWindow.setVisible(true); | ||
- | } | ||
- | | ||
- | public static void main(String[] args) { | ||
- | javax.swing.SwingUtilities.invokeLater(new Runnable() { | ||
- | public void run() { | ||
- | showGUI(); | ||
- | } | ||
- | }); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Βασικές μέθοδοι της κλάσης JFrame ==== | ||
- | |||
- | Οι βασικές μέθοδοι της κλάσης JFrame είναι οι παρακάτω: | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * JFrame.**DO_NOTHING_ON_CLOSE**: | ||
- | * JFrame.**HIDE_ON_CLOSE**: | ||
- | * JFrame.**DISPOSE_ON_CLOSE**: | ||
- | * JFrame.**EXIT_ON_CLOSE**: | ||
- | |||
- | <WRAP tip 80% center round> | ||
- | Η μέθοδος '' | ||
- | </ | ||
swing/intro.1521471456.txt.gz · Last modified: 2018/03/19 14:57 by gthanos