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:37]
gthanos [Events και Listeners]
swing:intro [2016/04/23 05:04] (current)
gthanos [Το παραπάνω παράθυτο ως αυτόνομη κλάση]
Line 15: Line 15:
 </​code>​ </​code>​
  
-Το παραπάνω σχήμα απεικονίζει γραφικά την σχέση μεταξύ ενός //​component//​ και ενός //​listener//​. Ένας listener μπορεί να έχει περισσότερες από μία μεθόδους που συνδέονται με λειτουργίες που θα εκτελεστούν κατά την λήψη ενός event. Οι μέθοδοι αυτές λέγονται //event handlers//. Κάθε πρόγραμμα καλείται να ορίσει ή να επαναορίσει (εάν είναι ήδη ορισμένοι) τους δικούς του event handlers για τα διάφορά events που μπορεί να συμβούν σε αυτό.+Το παραπάνω σχήμα απεικονίζει γραφικά την σχέση μεταξύ ενός //​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.1430447838.txt.gz · Last modified: 2016/02/26 11:15 (external edit)