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 04:45] gthanos [Η κλάση JButton] |
swing:buttons [2015/05/11 05:59] gthanos [Η κλάση JCheckBox] |
||
|---|---|---|---|
| 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 ===== | ||
| + | |||