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);
}
}