jueves, 28 de marzo de 2013

Semáforo en Java

Este es un ejercicio del libro de "Introduction to Java programming" del autor Y. Daniel Liang.

15.3 Escribir un programa que simule un semáforo. El programa le permitirá al usuario seleccionar entre las tres luces: rojo, amarillo, o verde. Cuando un botón radio es presionado, la luz respectiva se encenderá, y solo una puede estar encendida, como se ve en la imagen. 



Cuando el programa inicie, las luces deben estar apagadas. Además se hizo un menú para que no solo funcione con radio botones.

Bueno aquí esta el código en Java.

/** Light.java */
package backup;

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;

public class Light extends JPanel {
private boolean red;
private boolean yellow;
private boolean green;

    public Light() {
    red=false;
    yellow=false;
    green=false;
    }
    
    //Enciende Luz Roja
    public void red() {
    red=true;
    yellow=false;
    green=false;
    repaint();
    }
    
    //Enciende Luz Amarilla
    public void yellow() {
    red=false;
    yellow=true;
    green=false;
    repaint();
    }
    
    //Enciende Luz verde
    public void green() {
    red=false;
    yellow=false;
    green=true;
    repaint();
    }
    
    //Muestra Luces
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //Seleccionamos Rojo
    if(red) {
    g.setColor(Color.red);
    g.fillOval(10,10,20,20);
    g.setColor(Color.black);
    g.drawOval(10,35,20,20);
    g.drawOval(10,60,20,20);
    g.drawRect(5,5,30,80);
    }
    //Seleccionamos Amarillo
    else if(yellow) {
    g.setColor(Color.yellow);
    g.fillOval(10,35,20,20);
    g.setColor(Color.black);
    g.drawRect(5,5,30,80);
    g.drawOval(10,10,20,20);
    g.drawOval(10,60,20,20);
    }
    //Seleccionamos Verde
    else if(green) {
    g.setColor(Color.green);
    g.fillOval(10,60,20,20);
    g.setColor(Color.black);
    g.drawRect(5,5,30,80);
    g.drawOval(10,10,20,20);
    g.drawOval(10,35,20,20);
    }
    //El semaforo apagado
    else {
    g.setColor(Color.black);
    g.drawRect(5,5,30,80);
    g.drawOval(10,10,20,20);
    g.drawOval(10,35,20,20);
    g.drawOval(10,60,20,20);
    }
    }
    
    public Dimension getPreferredSize() {
    return new Dimension(40,90);
    }
}

---------------------------------------------------------------------------------------------------------------------------------------------


/** RadioButtonMenuDemo.java */

package backup;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class RadioButtonMenuDemo extends JFrame implements ActionListener {
private JMenuItem jmiRed, jmiYellow, jmiGreen, jmiClose;
private JRadioButton jrbRed, jrbYellow, jrbGreen;
private ButtonGroup btg = new ButtonGroup();
private Light light;  //El objeto Light

    public RadioButtonMenuDemo() {
    setTitle("Exercise15_3");
   
    //Creando la barra de menu y agregandola al JFrame
    JMenuBar jmb = new JMenuBar();
    setJMenuBar(jmb);
   
    //Instanciando el objeto JMenu con argumento Semaforo
    JMenu semaforoMenu = new JMenu("Semaforo");
    semaforoMenu.setMnemonic('S');
    jmb.add(semaforoMenu);
   
    //Instanciando el objeto JMenu con argumento Exit
    JMenu exitMenu = new JMenu("Exit");
    exitMenu.setMnemonic('E');
    jmb.add(exitMenu);
   
    //Agregando los JMenuItem al JMenu semaforo
    jmiRed = new JMenuItem("Red");
    jmiRed.setMnemonic('R');
    semaforoMenu.add(jmiRed);
   
    jmiYellow = new JMenuItem("Yellow");
    jmiYellow.setMnemonic('Y');
    semaforoMenu.add(jmiYellow);
   
    jmiGreen = new JMenuItem("Green");
    jmiGreen.setMnemonic('G');
    semaforoMenu.add(jmiGreen);
   
    //Agregando al JMenuItem Close al JMenu Exit
    jmiClose = new JMenuItem("Close");
    jmiClose.setMnemonic('C');
    exitMenu.add(jmiClose);
   
    //set keyboard accelerators
    jmiRed.setAccelerator(
    KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.CTRL_MASK));
    jmiYellow.setAccelerator(
    KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.CTRL_MASK));
    jmiGreen.setAccelerator(
    KeyStroke.getKeyStroke(KeyEvent.VK_G, ActionEvent.CTRL_MASK));
   
    //Se agrega el semaforo contenido en un panel al panel p1
    JPanel p1 = new JPanel();
    p1.setSize(200, 200);
    p1.setLayout(new FlowLayout(FlowLayout.CENTER));
    light = new Light();
    light.setSize(40, 90);
    p1.add(light);
   
    //Se coloca los radios botones al panel p2
    JPanel p2 = new JPanel();
    p2.setLayout(new FlowLayout());
    p2.add(jrbRed = new JRadioButton("Red",false));
    p2.add(jrbYellow = new JRadioButton("Yellow",false));
    p2.add(jrbGreen = new JRadioButton("Green",false));
   
    //Establecer los Keyboard mnemonics
    jrbRed.setMnemonic('R');
    jrbYellow.setMnemonic('Y');
    jrbGreen.setMnemonic('G');
    
    //Se agrupa los radios botones
    btg.add(jrbRed);
    btg.add(jrbYellow);
    btg.add(jrbGreen);
   
    //Se agregan los paneles al JFrame
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(p1, BorderLayout.CENTER);
    getContentPane().add(p2, BorderLayout.SOUTH);
   
    //Se registran los escuchas
    jrbRed.addActionListener(this);
    jrbYellow.addActionListener(this);
    jrbGreen.addActionListener(this);
    jmiRed.addActionListener(this);
    jmiYellow.addActionListener(this);
    jmiGreen.addActionListener(this);
    jmiClose.addActionListener(this);
    }
    
    public void actionPerformed(ActionEvent e) {
    String actionCommand = e.getActionCommand();
   
    //Si la accion viene de un JRadioButton
    if(e.getSource() instanceof JRadioButton) {
    if("Red".equals(actionCommand))
    light.red();
    else if("Yellow".equals(actionCommand))
    light.yellow();
    else if("Green".equals(actionCommand))
    light.green();
    //Si la accion viene de un JMenuItem
    } else if(e.getSource() instanceof JMenuItem) {
    if("Red".equals(actionCommand)) {
    light.red();
    jrbRed.setSelected(true);
    } else if("Yellow".equals(actionCommand)) {
    light.yellow();
    jrbYellow.setSelected(true);
    } else if("Green".equals(actionCommand)) {
    light.green();
    jrbGreen.setSelected(true);
    } else if("Close".equals(actionCommand))
    System.exit(0);
    }
    }
    
    public static void main(String[] args) {
    RadioButtonMenuDemo frame = new RadioButtonMenuDemo();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 190);
    frame.setResizable(false);
    frame.setVisible(true);
    }
}


Algo más, si quieres donar a mi blog, se le agradecería mucho, ya que me animaría a publicar más programas hecho por este servidor. Gracias.

1 comentario: