swing:intro

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
swing:intro [2015/05/01 02:32]
gthanos [Events και Listeners]
swing:intro [2016/04/23 05:04] (current)
gthanos [Το παραπάνω παράθυτο ως αυτόνομη κλάση]
Line 9: Line 9:
 <​code>​ <​code>​
          ​----------------- ​        /​------\ ​         ---------------          ​----------------- ​        /​------\ ​         ---------------
-         ​| ​              ​|        /        \         ​| ​            |+         ​| ​ ​Graphical ​   ​|        /        \         ​| ​            |
          ​| ​ Component ​   | ----> [  Event   ] ----> ​ |  Listener ​  |          ​| ​ Component ​   | ----> [  Event   ] ----> ​ |  Listener ​  |
          ​| ​              ​| ​       \        /         ​| ​            |          ​| ​              ​| ​       \        /         ​| ​            |
Line 15: Line 15:
 </​code>​ </​code>​
  
 +Το παραπάνω σχήμα απεικονίζει γραφικά την σχέση μεταξύ ενός //​component//​ και ενός //​listener//​. Ένας listener μπορεί να έχει περισσότερες από μία μεθόδους που συνδέονται με λειτουργίες που θα εκτελεστούν κατά την λήψη ενός event. Οι μέθοδοι αυτές λέγονται //event handlers//. Κάθε πρόγραμμα καλείται να ορίσει ή να επαναορίσει (εάν είναι ήδη ορισμένοι) τους δικούς του event handlers για τα διαφορά events που μπορεί να συμβούν σε αυτό.
 +
 +<WRAP tip 80% center round>
 +Βασική διαφορά του event driven προγραμματισμού είναι ότι δημιουργούμε αντικείμενα και μεθόδους (event listeners) τα οποία δεν γνωρίζουμε αν θα κληθούν και με ποια σειρά θα κληθούν,​ καθώς αυτό εξαρτάται από τον χρήστη που χρησιμοποιεί το πρόγραμμα. Ο προγραμματιστής κατά κανόνα δεν έχει έλεγχο στην σειρά εκτέλεσης των προγραμμάτων αυτών.
 +</​WRAP>​
 +
 +===== Το πρώτο μου πρόγραμμα =====
 +
 +Παρακάτω φτιάχνουμε ένα πρώτο απλό παραθυρικό πρόγραμμα το οποίο έχει μόνο ένα κουμπί που τερματίζει την εφαρμογή. Κατεβάστε και τρέξτε τα επόμενα δύο αρχεία.
 +
 +<code java FirstWindow.java>​
 +import javax.swing.JFrame;​
 +import javax.swing.JButton;​
 +
 +public class FirstSwingDemo {
 +  public static final int WIDTH = 300;
 +  public static final int HEIGHT = 200;
 +  ​
 +  public static void main(String[] args) {
 +    JFrame firstWindow = new JFrame();
 +    firstWindow.setSize(WIDTH,​ HEIGHT);
 +    firstWindow.setTitle("​First Window Program!"​);​
 +    firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);​
 +    JButton endButton = new JButton("​Click to end program."​);​
 +    EndingListener buttonEar = new EndingListener();​
 +    endButton.addActionListener(buttonEar);​
 +    firstWindow.add(endButton);​
 +    firstWindow.setVisible(true);​
 +  }
 +}
 +</​code>​
 +
 +<code java EndingListener.java>​
 +import java.awt.event.*;​
 +
 +public class EndingListener implements ActionListener {
 +  public void actionPerformed(ActionEvent e) {
 +    System.exit(0);​
 +  }
 +}
 +</​code>​
 +
 +Ας εξετάσουμε όμως τι κάνει το πρόγραμμα μας. Αρχικά δημιουργούμε ένα αντικείμενο του τύπου //JFrame// μέσα από την κλήση.
 +<code java>
 +    JFrame firstWindow = new JFrame();
 +</​code>​
 +Το αντικείμενο αυτό είναι ένα απλό παράθυρο με τρία κουμπιά (minimize, resize, close). Στη συνέχεια ορίζουμε το μέγεθος του παραθύρου (σε pixels) και τον τίτλο του. ​
 +<code java>
 +    firstWindow.setSize(WIDTH,​ HEIGHT);
 +    firstWindow.setTitle("​First Window Program!"​);​
 +</​code>​
 +Από την εμπειρία σας γνωρίζετε ότι όταν πατήσετε το κουμπί για το κλείσιμο του παραθύρου τότε το παράθυρο κλείνει και η εφαρμογή τερματίζεται. Η παρακάτω γραμμή διαχειρίζεται διαφορετικά ένα click event στο κουμπί κλεισίματος του παραθύρου,​ όπου όταν πατήσετε το κουμπί κλεισίματος αντί το παράθυρο να κλείσει δεν κάνει τίποτα.
 +<code java>
 +firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);​
 +</​code>​
 +
 +Στην συνέχεια ορίζουμε ένα αντικείμενο τύπου JButton (κουμπί) με τίτλο "Click to end program."​ και δημιουργούμε και έναν Listener τον οποίο συνδέουμε με το συγκεκριμένο κουμπί. ​
 +<code java>
 +JButton endButton = new JButton("​Click to end program."​);​
 +EndingListener buttonEar = new EndingListener();​
 +endButton.addActionListener(buttonEar);​
 +</​code>​
 +
 +Προσθέτουμε το κουμπί στο παράθυρο και ορίζουμε ότι το παράθυρο που φτιάξαμε θέλουμε να είναι ορατό.
 +<code java>
 +firstWindow.add(endButton);​
 +firstWindow.setVisible(true);​
 +</​code>​
 +==== Χρήση μίας ανώνυμης κλάσης ActionListener ====
 +
 +Για να μην έχουμε πολλαπλά αρχεία,​ μία παραλλαγή των παραπάνω είναι να τοποθετήσουμε την κλάση EndingListener σε μία ανώνυμη κλάση, ως εξής:
 +
 +<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 main(String[] args) {
 +    JFrame firstWindow = new JFrame();
 +    firstWindow.setSize(WIDTH,​ HEIGHT);
 +    firstWindow.setTitle("​First Window Program!"​);​
 +    firstWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);​
 +    JButton endButton = new JButton("​Click to end program."​);​
 +    ​
 +    ActionListener buttonEar = new ActionListener() {
 +      public void actionPerformed(ActionEvent e) {
 +        System.exit(0);​
 +      }
 +    };
 +    ​
 +    endButton.addActionListener(buttonEar);​
 +    firstWindow.add(endButton);​
 +    firstWindow.setVisible(true);​
 +  }
 +}
 +</​code>​
 +
 +==== Το παραπάνω παράθυρο ως αυτόνομη κλάση ====
 +
 +Αν θέλατε να δημιουργήσετε μία κλάση που να υλοποιεί το συγκεκριμένο παράθυρο,​ θα μπορούσατε να το κάνετε ως εξής:
 +
 +<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 FirstWindow() {
 +    super();
 +    setSize(WIDTH,​ HEIGHT);
 +    setTitle("​First Window Program!"​);​
 +    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);​
 +    JButton endButton = new JButton("​Click to end program."​);​
 +    ActionListener buttonEar = new ActionListener() {
 +      public void actionPerformed(ActionEvent e) {
 +        System.exit(0);​
 +      }
 +    };
 +    endButton.addActionListener(buttonEar);​
 +    add(endButton);​
 +  }
 +  ​
 +  public static void main(String[] args) {
 +    FirstWindow w = new FirstWindow();​
 +    w.setVisible(true);​
 +  }
 +}
 +</​code>​
 +
 +==== Βασικές μέθοδοι της κλάσης 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>​
  
swing/intro.1430447530.txt.gz · Last modified: 2016/02/26 11:15 (external edit)