===== Η κλάση JButton ===== Ένα αντικείμενο τύπου Button δημιουργείται όπως είδαμε με χρήση της κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html|JButton]] στην ενότητα [[swing:first_program|Το πρώτο μου πρόγραμμα]] ως εξής: JButton endButton = new JButton("Click to end program"); endButton.addActionListener(new endProgramActionListener()); someJFrame.add(endButton); ,όπου το Button που δημιουργείται γράφει //"Click to end program"//. Ένα αντικείμενο [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html|JButton]] επίσης συνδέεται με έναν ή περισσότερα αντικείμενα του τύπου //ActionListener// τα οποία εκτελούνται όταν ο χρήστης αλληλεπιδρά με το Button αυτό. Τέλος, το κάθε Button θα πρέπει να ενσωματωθεί σε ένα παράθυρο (ή σε κάποιο panel όπως θα δούμε αργότερα) μέσα από μία δήλωση ανάλογη με την 3η γραμμή του παραπάνω κώδικα. Η κλάση JButton συνδεέται με τα κουμπιά που εισάγει ο χρήστης και όχι με τα κουμπιά //minimize, resize, close// που βρίσκονται επάνω στο παράθυρο (για λειτουργικό σύστημα Windows επάνω δεξιά) και εισάγονται από το //window manager// του λειτουργικού συστήματος. ===== Action Listeners ===== Όταν ο χρήστης πατάει το ποντίκι του πάνω σε ένα κουμπί ενός παραθύρου δημιουργείται ένα αντικείμενο που αντιστοιχεί στο event που δημιούργησε ο χρήστης. Το αντικείμενο αυτό, λαμβάνεται από ένα άλλο αντικείμενο που λειτουργεί ως ακροατής τέτοιων events και είναι τύπου [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html|ActionListener]]. Το αντικείμενο [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html|ActioListener]] όταν λάβει ένα //event// εκτελεί τη μέθοδο [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html#actionPerformed-java.awt.event.ActionEvent-|ActionPerformed]] με όρισμα το [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionEvent.html|ActionEvent]] που παρήχθη. void actionPerformed(ActionEvent e); Η κλήση της συγκεκριμένης μεθόδου γίνεται ασύγχρονα πράγμα που σημαίνει ότι καλείστε να ορίσετε την μέθοδο, αλλά σε κανένα σημείο του προγράμματος σας δεν θα χρειαστεί να την καλέσετε. Δείτε, μεταγλωττίστε και τρέξτε το παρακάτω παράδειγμα από [[https://docs.oracle.com/javase/tutorial/uiswing/components/button.html|το site της Oracle]] (αλλαγμένο), το οποίο και θα συζητήσουμε στη συνέχεια. import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.ImageIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; /* * ButtonDemo.java requires the following files: * right.gif * middle.gif * left.gif */ public class ButtonDemo extends JPanel implements ActionListener { protected JButton b1, b2, b3; public ButtonDemo() { ImageIcon leftButtonIcon = new ImageIcon("right.gif"); ImageIcon middleButtonIcon = new ImageIcon("middle.gif"); ImageIcon rightButtonIcon = new ImageIcon("left.gif"); b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEFT); b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b2.setActionCommand("middle"); b3 = new JButton("Enable middle button", rightButtonIcon); b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); //Listen for actions on buttons 1 and 3. b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable the middle button."); b2.setToolTipText("This middle button does nothing when you click it."); b3.setToolTipText("Click this button to enable the middle button."); //Add Components to this container, using the default FlowLayout. add(b1); add(b2); add(b3); } public void actionPerformed(ActionEvent e) { if ("disable".equals(e.getActionCommand())) { b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } else if ("enable".equals(e.getActionCommand())){ b2.setEnabled(true); b1.setEnabled(true); b3.setEnabled(false); } else if ("middle".equals(e.getActionCommand())){ b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("ButtonDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. ButtonDemo newContentPane = new ButtonDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Size and display the window. frame.pack(); 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(); } }); } } Το παραπάνω παράδειγμα απαιτεί την χρήση των παρακάτω εικόνων {{:swing:buttondemoimages.zip|}}. Από τον κώδικα μπορούμε να εξάγουμε τα εξής: - Κάθε αντικείμενο [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html|JButton]] μπορεί να περιέχει κείμενο και ένα εικονίδιο σε αναλογία με τα αντικείμενα τύπου JLabel. Επιπλέον, μπορεί να περιέχει και HTML όπως και τα [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JLabel.html|JLabel]] (δεν εμφανίζεται στο παραπάνω παράδειγμα). - Για κάθε [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html|JButton]] οφείλουμε να ορίσουμε τουλάχιστον ένα αντικείμενο τύπου [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html|ActionListener]] το οποίο ακούει στα //clicks// του ποντικιού πάνω στο //button//. Ο κώδικας που ακούει και "πιάνει" το συγκεκριμένο //event// είναι αρμόδιος για να κάνει όλες τις απαραίτητες ενέργειες. - Το //click// ενός **JButton** μπορεί να ανατεθεί σε ένα //keyboard shortcut//. Για να ορίσετε ένα keyboard shortcut χρησιμοποιήστε τη μέθοδο ''public void setMnemonic(int c)'' της κλάσης [[https://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html|AbstractButton]].