This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
swing:buttons [2015/05/11 04:45] gthanos [Η κλάση JButton] |
swing:buttons [2016/02/26 11:15] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Buttons, Check Boxes & Radio Buttons ====== | ====== Buttons, Check Boxes & Radio Buttons ====== | ||
- | Για την δημιουργία ενός button μπορείτε να χρησιμοποιήσετε μία κλάση από τις απογόνους της κλάσης [[https://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html|javax.swing.AbstractButton]], όπως οι [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html|JButton]], [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JCheckBox.html|JCheckBox]] | + | Για την δημιουργία ενός button μπορείτε να χρησιμοποιήσετε μία κλάση από τις απογόνους της κλάσης [[https://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html|javax.swing.AbstractButton]], όπως οι [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html|JButton]], [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JCheckBox.html|JCheckBox]] |
- | ή [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JRadioButton.html|JRadioButton]]. Άλλες υποκλάσεις της κλάσης //AbstractButton// είναι οι [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JMenuItem.html|JMenuItem]], [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JCheckBoxMenuItem.html|JCheckBoxMenuItem]] και [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JRadioButtonMenuItem.html|JRadioButtonMenuItem]] τις οποίες θα δούμε στη συνέχεια. | + | ή [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JRadioButton.html|JRadioButton]]. Άλλες υποκλάσεις της κλάσης //AbstractButton// είναι οι [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JMenuItem.html|JMenuItem]], [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JCheckBoxMenuItem.html|JCheckBoxMenuItem]] και [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JRadioButtonMenuItem.html|JRadioButtonMenuItem]] τις οποίες θα δούμε στη συνέχεια. |
===== Η κλάση JButton ===== | ===== Η κλάση JButton ===== | ||
Line 125: | Line 125: | ||
- Για κάθε Button οφείλουμε να ορίσουμε τουλάχιστον ένα αντικείμενο τύπου ActionListener. | - Για κάθε Button οφείλουμε να ορίσουμε τουλάχιστον ένα αντικείμενο τύπου ActionListener. | ||
- Κάθε Button μπορεί να συνδέεται με ένα //keyboard shortcut//. Για να ορίσετε ένα keyboard shortcut χρησιμοποιήστε τη μέθοδο ''public void setMnemonic(int c)'' της κλάσης AbstractButton. | - Κάθε Button μπορεί να συνδέεται με ένα //keyboard shortcut//. Για να ορίσετε ένα keyboard shortcut χρησιμοποιήστε τη μέθοδο ''public void setMnemonic(int c)'' της κλάσης AbstractButton. | ||
+ | |||
+ | ===== Η κλάση JCheckBox ===== | ||
+ | |||
+ | Ένα //check box// έχει δύο δυνατές καταστάσεις //α)// επιλεγμένο και //β)// απο-επιλεγμένο. Κάθε //check box// υλοποιείται από την κλάση [[https://docs.oracle.com/javase/7/docs/api/javax/swing/JCheckBox.html|JCheckBox]]. Δείτε το παρακάτω παράδειγμα χρήσης της κλάσης JCheckBox από το site της Oracle | ||
+ | |||
+ | <code java CheckBoxDemo.java> | ||
+ | package components; | ||
+ | |||
+ | import java.awt.*; | ||
+ | import java.awt.event.*; | ||
+ | import javax.swing.*; | ||
+ | |||
+ | /* | ||
+ | * CheckBoxDemo.java requires 16 image files in the images/geek | ||
+ | * directory: | ||
+ | * geek-----.gif, geek-c---.gif, geek--g--.gif, geek---h-.gif, geek----t.gif, | ||
+ | * geek-cg--.gif, ..., geek-cght.gif. | ||
+ | */ | ||
+ | public class CheckBoxDemo extends JPanel | ||
+ | implements ItemListener { | ||
+ | JCheckBox chinButton; | ||
+ | JCheckBox glassesButton; | ||
+ | JCheckBox hairButton; | ||
+ | JCheckBox teethButton; | ||
+ | |||
+ | /* | ||
+ | * Four accessory choices provide for 16 different | ||
+ | * combinations. The image for each combination is | ||
+ | * contained in a separate image file whose name indicates | ||
+ | * the accessories. The filenames are "geek-XXXX.gif" | ||
+ | * where XXXX can be one of the following 16 choices. | ||
+ | * The "choices" StringBuffer contains the string that | ||
+ | * indicates the current selection and is used to generate | ||
+ | * the file name of the image to display. | ||
+ | |||
+ | ---- //zero accessories | ||
+ | |||
+ | c--- //one accessory | ||
+ | -g-- | ||
+ | --h- | ||
+ | ---t | ||
+ | |||
+ | cg-- //two accessories | ||
+ | c-h- | ||
+ | c--t | ||
+ | -gh- | ||
+ | -g-t | ||
+ | --ht | ||
+ | |||
+ | -ght //three accessories | ||
+ | c-ht | ||
+ | cg-t | ||
+ | cgh- | ||
+ | |||
+ | cght //all accessories | ||
+ | */ | ||
+ | |||
+ | StringBuffer choices; | ||
+ | JLabel pictureLabel; | ||
+ | |||
+ | public CheckBoxDemo() { | ||
+ | super(new BorderLayout()); | ||
+ | |||
+ | //Create the check boxes. | ||
+ | chinButton = new JCheckBox("Chin"); | ||
+ | chinButton.setMnemonic(KeyEvent.VK_C); | ||
+ | chinButton.setSelected(true); | ||
+ | |||
+ | glassesButton = new JCheckBox("Glasses"); | ||
+ | glassesButton.setMnemonic(KeyEvent.VK_G); | ||
+ | glassesButton.setSelected(true); | ||
+ | |||
+ | hairButton = new JCheckBox("Hair"); | ||
+ | hairButton.setMnemonic(KeyEvent.VK_H); | ||
+ | hairButton.setSelected(true); | ||
+ | |||
+ | teethButton = new JCheckBox("Teeth"); | ||
+ | teethButton.setMnemonic(KeyEvent.VK_T); | ||
+ | teethButton.setSelected(true); | ||
+ | |||
+ | //Register a listener for the check boxes. | ||
+ | chinButton.addItemListener(this); | ||
+ | glassesButton.addItemListener(this); | ||
+ | hairButton.addItemListener(this); | ||
+ | teethButton.addItemListener(this); | ||
+ | |||
+ | //Indicates what's on the geek. | ||
+ | choices = new StringBuffer("cght"); | ||
+ | |||
+ | //Set up the picture label | ||
+ | pictureLabel = new JLabel(); | ||
+ | pictureLabel.setFont(pictureLabel.getFont().deriveFont(Font.ITALIC)); | ||
+ | updatePicture(); | ||
+ | |||
+ | //Put the check boxes in a column in a panel | ||
+ | JPanel checkPanel = new JPanel(new GridLayout(0, 1)); | ||
+ | checkPanel.add(chinButton); | ||
+ | checkPanel.add(glassesButton); | ||
+ | checkPanel.add(hairButton); | ||
+ | checkPanel.add(teethButton); | ||
+ | |||
+ | add(checkPanel, BorderLayout.LINE_START); | ||
+ | add(pictureLabel, BorderLayout.CENTER); | ||
+ | setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); | ||
+ | } | ||
+ | |||
+ | /** Listens to the check boxes. */ | ||
+ | public void itemStateChanged(ItemEvent e) { | ||
+ | int index = 0; | ||
+ | char c = '-'; | ||
+ | Object source = e.getItemSelectable(); | ||
+ | |||
+ | if (source == chinButton) { | ||
+ | index = 0; | ||
+ | c = 'c'; | ||
+ | } else if (source == glassesButton) { | ||
+ | index = 1; | ||
+ | c = 'g'; | ||
+ | } else if (source == hairButton) { | ||
+ | index = 2; | ||
+ | c = 'h'; | ||
+ | } else if (source == teethButton) { | ||
+ | index = 3; | ||
+ | c = 't'; | ||
+ | } | ||
+ | |||
+ | //Now that we know which button was pushed, find out | ||
+ | //whether it was selected or deselected. | ||
+ | if (e.getStateChange() == ItemEvent.DESELECTED) { | ||
+ | c = '-'; | ||
+ | } | ||
+ | |||
+ | //Apply the change to the string. | ||
+ | choices.setCharAt(index, c); | ||
+ | |||
+ | updatePicture(); | ||
+ | } | ||
+ | |||
+ | protected void updatePicture() { | ||
+ | //Get the icon corresponding to the image. | ||
+ | ImageIcon icon = createImageIcon( | ||
+ | "images/geek/geek-" | ||
+ | + choices.toString() | ||
+ | + ".gif"); | ||
+ | pictureLabel.setIcon(icon); | ||
+ | pictureLabel.setToolTipText(choices.toString()); | ||
+ | if (icon == null) { | ||
+ | pictureLabel.setText("Missing Image"); | ||
+ | } else { | ||
+ | pictureLabel.setText(null); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** Returns an ImageIcon, or null if the path was invalid. */ | ||
+ | protected static ImageIcon createImageIcon(String path) { | ||
+ | java.net.URL imgURL = CheckBoxDemo.class.getResource(path); | ||
+ | if (imgURL != null) { | ||
+ | return new ImageIcon(imgURL); | ||
+ | } else { | ||
+ | System.err.println("Couldn't find file: " + path); | ||
+ | return null; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 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("CheckBoxDemo"); | ||
+ | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
+ | |||
+ | //Create and set up the content pane. | ||
+ | JComponent newContentPane = new CheckBoxDemo(); | ||
+ | newContentPane.setOpaque(true); //content panes must be opaque | ||
+ | frame.setContentPane(newContentPane); | ||
+ | |||
+ | //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(); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Θα χρειαστείτε επιπλέον τις φωτογραφίες που περιέχονται στο αρχείο zip {{:swing:geek-images.zip|}}. | ||
+ | |||
+ | ===== Οι κλάσεις ButtonGroup και JRadioButton ===== | ||
+ | |||
+ | Τα //radio buttons// είναι ανάλογα με τα //check boxes// με την ιδιαιτερότητα ότι μόνο ένα button μπορεί να είναι επιλεγμένο κάθε φορά. Τα radio buttons οργανώνονται σε button groups. Από τα κουμπιά ενός button group μόνο ένα είναι επιλέξιμο. | ||
+ | |||
+ | Κάθε φορά που ο χρήστης επιλέγει ένα radio button τότε δημιουργείται ένα αντικείμενο τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionEvent.html|java.awt.events.ActionEvent]] το οποίο λαμβάνεται από ένα αντικείμενο τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html|ActionListener]] που συνδέεται με το button. Παράλληλα, δημιουργούνται και δύο αντικείμενα τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/ItemEvent.html|java.awt.events.ItemEvent]] ένα αντικείμενο για το button που επιλέχθηκε και ένα αντικείμενο για το button που απο-επιλέχθηκε (εάν υπήρξε τέτοιο), τα οποία λαμβάνονται από ένα αντικείμενο του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/ItemListener.html|ItemListener]]. Συνήθως χρησιμοποιούμε ItemListeners όπως φαίνεται στο παρακάτω παράδειγμα από το site της Oracle. | ||
+ | |||
+ | <code java RadioButtonDemo.java> | ||
+ | package components; | ||
+ | |||
+ | import java.awt.*; | ||
+ | import java.awt.event.*; | ||
+ | import javax.swing.*; | ||
+ | |||
+ | /* | ||
+ | * RadioButtonDemo.java requires these files: | ||
+ | * images/Bird.gif | ||
+ | * images/Cat.gif | ||
+ | * images/Dog.gif | ||
+ | * images/Rabbit.gif | ||
+ | * images/Pig.gif | ||
+ | */ | ||
+ | public class RadioButtonDemo extends JPanel | ||
+ | implements ActionListener { | ||
+ | static String birdString = "Bird"; | ||
+ | static String catString = "Cat"; | ||
+ | static String dogString = "Dog"; | ||
+ | static String rabbitString = "Rabbit"; | ||
+ | static String pigString = "Pig"; | ||
+ | |||
+ | JLabel picture; | ||
+ | |||
+ | public RadioButtonDemo() { | ||
+ | super(new BorderLayout()); | ||
+ | |||
+ | //Create the radio buttons. | ||
+ | JRadioButton birdButton = new JRadioButton(birdString); | ||
+ | birdButton.setMnemonic(KeyEvent.VK_B); | ||
+ | birdButton.setActionCommand(birdString); | ||
+ | birdButton.setSelected(true); | ||
+ | |||
+ | JRadioButton catButton = new JRadioButton(catString); | ||
+ | catButton.setMnemonic(KeyEvent.VK_C); | ||
+ | catButton.setActionCommand(catString); | ||
+ | |||
+ | JRadioButton dogButton = new JRadioButton(dogString); | ||
+ | dogButton.setMnemonic(KeyEvent.VK_D); | ||
+ | dogButton.setActionCommand(dogString); | ||
+ | |||
+ | JRadioButton rabbitButton = new JRadioButton(rabbitString); | ||
+ | rabbitButton.setMnemonic(KeyEvent.VK_R); | ||
+ | rabbitButton.setActionCommand(rabbitString); | ||
+ | |||
+ | JRadioButton pigButton = new JRadioButton(pigString); | ||
+ | pigButton.setMnemonic(KeyEvent.VK_P); | ||
+ | pigButton.setActionCommand(pigString); | ||
+ | |||
+ | //Group the radio buttons. | ||
+ | ButtonGroup group = new ButtonGroup(); | ||
+ | group.add(birdButton); | ||
+ | group.add(catButton); | ||
+ | group.add(dogButton); | ||
+ | group.add(rabbitButton); | ||
+ | group.add(pigButton); | ||
+ | |||
+ | //Register a listener for the radio buttons. | ||
+ | birdButton.addActionListener(this); | ||
+ | catButton.addActionListener(this); | ||
+ | dogButton.addActionListener(this); | ||
+ | rabbitButton.addActionListener(this); | ||
+ | pigButton.addActionListener(this); | ||
+ | |||
+ | //Set up the picture label. | ||
+ | picture = new JLabel(createImageIcon("images/" | ||
+ | + birdString | ||
+ | + ".gif")); | ||
+ | |||
+ | //The preferred size is hard-coded to be the width of the | ||
+ | //widest image and the height of the tallest image. | ||
+ | //A real program would compute this. | ||
+ | picture.setPreferredSize(new Dimension(177, 122)); | ||
+ | |||
+ | |||
+ | //Put the radio buttons in a column in a panel. | ||
+ | JPanel radioPanel = new JPanel(new GridLayout(0, 1)); | ||
+ | radioPanel.add(birdButton); | ||
+ | radioPanel.add(catButton); | ||
+ | radioPanel.add(dogButton); | ||
+ | radioPanel.add(rabbitButton); | ||
+ | radioPanel.add(pigButton); | ||
+ | |||
+ | add(radioPanel, BorderLayout.LINE_START); | ||
+ | add(picture, BorderLayout.CENTER); | ||
+ | setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); | ||
+ | } | ||
+ | |||
+ | /** Listens to the radio buttons. */ | ||
+ | public void actionPerformed(ActionEvent e) { | ||
+ | picture.setIcon(createImageIcon("images/" | ||
+ | + e.getActionCommand() | ||
+ | + ".gif")); | ||
+ | } | ||
+ | |||
+ | /** Returns an ImageIcon, or null if the path was invalid. */ | ||
+ | protected static ImageIcon createImageIcon(String path) { | ||
+ | java.net.URL imgURL = RadioButtonDemo.class.getResource(path); | ||
+ | if (imgURL != null) { | ||
+ | return new ImageIcon(imgURL); | ||
+ | } else { | ||
+ | System.err.println("Couldn't find file: " + path); | ||
+ | return null; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 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("RadioButtonDemo"); | ||
+ | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
+ | |||
+ | //Create and set up the content pane. | ||
+ | JComponent newContentPane = new RadioButtonDemo(); | ||
+ | newContentPane.setOpaque(true); //content panes must be opaque | ||
+ | frame.setContentPane(newContentPane); | ||
+ | |||
+ | //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(); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Για το παραπάνω παράδειγμα θα χρειαστείτε τις εικόνες {{:swing:animals.zip|}} | ||