User Tools

Site Tools


swing:jbutton

Η κλάση JButton

Ένα αντικείμενο τύπου Button δημιουργείται όπως είδαμε με χρήση της κλάση JButton στην ενότητα Το πρώτο μου πρόγραμμα ως εξής:

JButton endButton = new JButton("Click to end program");
endButton.addActionListener(new endProgramActionListener());
someJFrame.add(endButton);

,όπου το Button που δημιουργείται γράφει “Click to end program”. Ένα αντικείμενο JButton επίσης συνδέεται με έναν ή περισσότερα αντικείμενα του τύπου ActionListener τα οποία εκτελούνται όταν ο χρήστης αλληλεπιδρά με το Button αυτό. Τέλος, το κάθε Button θα πρέπει να ενσωματωθεί σε ένα παράθυρο (ή σε κάποιο panel όπως θα δούμε αργότερα) μέσα από μία δήλωση ανάλογη με την 3η γραμμή του παραπάνω κώδικα.

Η κλάση JButton συνδεέται με τα κουμπιά που εισάγει ο χρήστης και όχι με τα κουμπιά minimize, resize, close που βρίσκονται επάνω στο παράθυρο (για λειτουργικό σύστημα Windows επάνω δεξιά) και εισάγονται από το window manager του λειτουργικού συστήματος.

Action Listeners

Όταν ο χρήστης πατάει το ποντίκι του πάνω σε ένα κουμπί ενός παραθύρου δημιουργείται ένα αντικείμενο που αντιστοιχεί στο event που δημιούργησε ο χρήστης. Το αντικείμενο αυτό, λαμβάνεται από ένα άλλο αντικείμενο που λειτουργεί ως ακροατής τέτοιων events και είναι τύπου ActionListener. Το αντικείμενο ActioListener όταν λάβει ένα event εκτελεί τη μέθοδο ActionPerformed με όρισμα το ActionEvent που παρήχθη.

void actionPerformed(ActionEvent e);

Η κλήση της συγκεκριμένης μεθόδου γίνεται ασύγχρονα πράγμα που σημαίνει ότι καλείστε να ορίσετε την μέθοδο, αλλά σε κανένα σημείο του προγράμματος σας δεν θα χρειαστεί να την καλέσετε.

Δείτε, μεταγλωττίστε και τρέξτε το παρακάτω παράδειγμα από το site της Oracle (αλλαγμένο), το οποίο και θα συζητήσουμε στη συνέχεια.

ButtonDemo.java
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(); 
      }
    });
  }
}

Το παραπάνω παράδειγμα απαιτεί την χρήση των παρακάτω εικόνων buttondemoimages.zip. Από τον κώδικα μπορούμε να εξάγουμε τα εξής:

  1. Κάθε αντικείμενο JButton μπορεί να περιέχει κείμενο και ένα εικονίδιο σε αναλογία με τα αντικείμενα τύπου JLabel. Επιπλέον, μπορεί να περιέχει και HTML όπως και τα JLabel (δεν εμφανίζεται στο παραπάνω παράδειγμα).
  2. Για κάθε JButton οφείλουμε να ορίσουμε τουλάχιστον ένα αντικείμενο τύπου ActionListener το οποίο ακούει στα clicks του ποντικιού πάνω στο button. Ο κώδικας που ακούει και “πιάνει” το συγκεκριμένο event είναι αρμόδιος για να κάνει όλες τις απαραίτητες ενέργειες.
  3. Το click ενός JButton μπορεί να ανατεθεί σε ένα keyboard shortcut. Για να ορίσετε ένα keyboard shortcut χρησιμοποιήστε τη μέθοδο public void setMnemonic(int c) της κλάσης AbstractButton.
swing/jbutton.txt · Last modified: 2018/03/27 14:16 (external edit)