This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
swing:buttons [2015/05/11 05:56] gthanos |
swing:buttons [2015/05/11 06:20] gthanos [Οι κλάσεις ButtonGroup και JRadioButton] |
||
---|---|---|---|
Line 322: | Line 322: | ||
Θα χρειαστείτε επιπλέον τις φωτογραφίες που περιέχονται στο αρχείο zip {{:swing:geek-images.zip|}}. | Θα χρειαστείτε επιπλέον τις φωτογραφίες που περιέχονται στο αρχείο 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> | ||
+ | |||