package horses; import java.applet.AudioClip; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.*; /** * Clase que nos permite conocer el uso del JCheckBox * @author Magus */ public class Main extends JFrame implements ItemListener { JLabel horses; JCheckBox chkHorse1; AudioClip horse1; JCheckBox chkHorse2; AudioClip horse2; JCheckBox chkHorse3; AudioClip horse3; JCheckBox chkHorse4; AudioClip horse4; JPanel pnlCheckBox; /** Creates a new instance of Main */ public Main() { setLayout(new BorderLayout()); pnlCheckBox = new JPanel(new GridLayout(2,2)); Toolkit tk = Toolkit.getDefaultToolkit(); Image imaHorses = tk.getImage(Main.class.getResource("horses.png")); horses = new JLabel(); horses.setIcon(new ImageIcon(imaHorses)); getContentPane().add(horses, BorderLayout.CENTER); horse1 = JApplet.newAudioClip(Main.class.getResource("horse1.wav")); horse2 = JApplet.newAudioClip(Main.class.getResource("horse2.wav")); horse3 = JApplet.newAudioClip(Main.class.getResource("horse3.wav")); horse4 = JApplet.newAudioClip(Main.class.getResource("horse4.wav")); /** * Un JCheckBox podemos crearlo de la misma manera que creamos un boton, * de hecho un JCheckBox es muy similar a un boton. Para poderlo crear * utilizamos un constructor al que pasemos lo que queremos que diga el * JCheckbBox. */ chkHorse1 = new JCheckBox("Caballo 1"); /** * Al igual que la mayoria de los componentes de Swing el JCheckBox * tiene un metodo para poder ponerle imagenes. El metodo setIcon es el * icono que va a aparecer cuando esta deseleccionado y el metodo * setSelectedIcon es el icono que va a aparecer cuando esta * seleccionado. Estos dos metodos se utilizan de la manera que vimos en * el trial de imagenes. */ chkHorse1.setIcon(new ImageIcon(Main.class.getResource("horse1.png"))); chkHorse1.setSelectedIcon(new ImageIcon( Main.class.getResource("horse1-selected.png"))); /** * Para los JCheckBox podemos utilizar un ActionListener como hemos * hecho con los demas botones pero entonces no podriamos saber que tipo * de evento sucedio, si lo seleccionaron o deseleccionaron, por lo que * en vez de utilizar el ActionListener utilizamos un ItemListener. El * ItemListener se utiliza de una manera muy similar al ActionListener * y nos permite obtener mas informacion sobre el evento que se genero, * en particular la informacion sobre si se selecciono o se deselecciono * el JCheckBox. */ chkHorse1.addItemListener(this); pnlCheckBox.add(chkHorse1); chkHorse2 = new JCheckBox("Caballo 2"); chkHorse2.setIcon(new ImageIcon(Main.class.getResource("horse2.png"))); chkHorse2.setSelectedIcon(new ImageIcon( Main.class.getResource("horse2-selected.png"))); chkHorse2.addItemListener(this); pnlCheckBox.add(chkHorse2); chkHorse3 = new JCheckBox("Caballo 3"); chkHorse3.setIcon(new ImageIcon(Main.class.getResource("horse3.png"))); chkHorse3.setSelectedIcon(new ImageIcon( Main.class.getResource("horse3-selected.png"))); chkHorse3.addItemListener(this); pnlCheckBox.add(chkHorse3); chkHorse4 = new JCheckBox("Caballo 4"); chkHorse4.setIcon(new ImageIcon(Main.class.getResource("horse4.png"))); chkHorse4.setSelectedIcon(new ImageIcon( Main.class.getResource("horse4-selected.png"))); chkHorse4.addItemListener(this); pnlCheckBox.add(chkHorse4); getContentPane().add(pnlCheckBox, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Caballos Cantadores!"); setSize(800,587); setResizable(false); setVisible(true); } /** * Metodo que se llama al iniciar el programa * * @param args the command line arguments */ public static void main(String[] args) { Main app = new Main(); } /** * ItemStateChanged es un metodo que se dispara automaticamente al cambiar * el estado de un JCheckBox. Es una funcion similar a actionPerformed e * incluso su sintaxis es similar con la diferencia de que esta recibe un * ItemEvent en vez de un ActionEvent. * * @param e El ItemEvent que representa el evento que sucedio. */ public void itemStateChanged(ItemEvent e) { boolean isSelected; /** * Con el metodo getStateChange() del ItemEvent que recibe el metodo * puedo saber si el JCheckBox fue seleccionado o fue deseleccionado, * dependiendo de esto puedo manejar el evento de maneras diferentes. */ isSelected = (e.getStateChange() == ItemEvent.SELECTED); /** * Del mismo modo que getSource() nos devuelve el componente que realizo * el evento en actionPerformed(), getItemSelectable() nos devuelve el * componente que realizo el evento en itemStateChanged() */ if (e.getItemSelectable() == chkHorse1) { if (isSelected) horse1.loop(); else horse1.stop(); } else if (e.getItemSelectable() == chkHorse2) { if (isSelected) horse2.loop(); else horse2.stop(); } else if (e.getItemSelectable() == chkHorse3) { if (isSelected) horse3.loop(); else horse3.stop(); } else if (e.getItemSelectable() == chkHorse4) { if (isSelected) { horse4.loop(); } else { horse4.stop(); } } } }