Skip to content

Commit

Permalink
Interfaz del controlador implementada
Browse files Browse the repository at this point in the history
  • Loading branch information
Aliere06 committed Apr 27, 2024
1 parent d30e64e commit e5fa27a
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 38 deletions.
Binary file modified Boceto Interfaz.xopp
Binary file not shown.
Binary file added bin/ControladorSemaforos$TablaInformación.class
Binary file not shown.
Binary file modified bin/ControladorSemaforos.class
Binary file not shown.
Binary file modified bin/PruebaSemaforo.class
Binary file not shown.
Binary file removed bin/Semaforo$1.class
Binary file not shown.
Binary file removed bin/Semaforo$2.class
Binary file not shown.
Binary file removed bin/Semaforo$3.class
Binary file not shown.
Binary file added bin/Semaforo$Foco.class
Binary file not shown.
Binary file modified bin/Semaforo.class
Binary file not shown.
115 changes: 115 additions & 0 deletions src/ControladorSemaforos.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,123 @@
* diferentes procesos, todos los procesos que se deseen sincronizar en
* conjunto deben contener una referencia a una misma instancia de esta
* clase.*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ControladorSemaforos {
//Atributo booleano para indicar la disponibilidad del controlador
private boolean disponible = true;
JFrame ventana = new JFrame("Controlador de Semáforos");
TablaInformación tabla = new TablaInformación();
int semáforosAgregados = 0;

public class TablaInformación extends JPanel{
String[][] celdas = new String[4][6];
//String[] fila = new String[4];
String[] cabecera = {"Semáforo", "Estado", "Foco Activo", "Terminar"};
JPanel[] columnas = new JPanel[4];
int filasOcupadas;

TablaInformación(){
setLayout(new FlowLayout(FlowLayout.CENTER,0,0));
setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 10));
setBackground(Color.DARK_GRAY);
for (int i=0; i<columnas.length; i++) {
columnas[i] = new JPanel(new GridLayout(6,1,0,0));
columnas[i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
columnas[i].add(new JLabel(cabecera[i]));
add(columnas[i]);
}
}

public void agregarFila(String[] fila) {
if (filasOcupadas < celdas[0].length) {
for (int i = 0; i < (columnas.length - 1); i++) {
columnas[i].add(new JLabel(fila[i]));
}
JPanel xPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
xPane.add(new JLabel("X"));
columnas[3].add(xPane);
filasOcupadas++;
getParent().revalidate();
getParent().repaint();
}
}

public void eliminarFila(int indice) {
if (indice > 0 && indice <= filasOcupadas) {
for (int i = 0; i < columnas.length; i++) {
columnas[i].remove(indice);
}
filasOcupadas--;
getParent().revalidate();
getParent().repaint();
}
}

public void actualizarFila(int indice, String[] fila) {
if (indice <= filasOcupadas) {
Component[] nombres = columnas[0].getComponents();
for (int i = 1; i < nombres.length; i++) {
JLabel etiqueta = (JLabel)nombres[i];
if (etiqueta.getText().equals(fila[0])) {
((JLabel)columnas[1].getComponent(i)).setText(fila[1]);
((JLabel)columnas[2].getComponent(i)).setText(fila[2]);
break;
}
}
revalidate();
repaint();
}
}
}

ControladorSemaforos(){
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ventana.setSize(350, 300);
Container contenedor = ventana.getContentPane();
contenedor.setLayout(new BorderLayout(0,0));
contenedor.setBackground(Color.DARK_GRAY);

JPanel titulo = new JPanel(new BorderLayout(0,0));
titulo.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 10));
titulo.setBackground(Color.GRAY);
JLabel lblTitulo = new JLabel("Controlador de semáforos");
JButton btnAgregar = new JButton("Agregar");
titulo.add(lblTitulo, BorderLayout.WEST);
titulo.add(btnAgregar, BorderLayout.EAST);


/* JPanel tabla = new JPanel(new FlowLayout());
tabla.setBorder(new EmptyBorder(10, 10, 10, 10));
JPanel columna1 = new JPanel(new GridLayout(6, 1));
columna1.add(new JLabel("Semáforo"));
tabla.add(columna1);
JPanel columna2 = new JPanel(new GridLayout(6, 1));
columna2.add(new JLabel("Estado"));
tabla.add(columna2);
JPanel columna3 = new JPanel(new GridLayout(6, 1));
columna3.add(new JLabel("Foco Activo"));
tabla.add(columna3);
JPanel columna4 = new JPanel(new GridLayout(6, 1));
columna4.add(new JLabel("Terminar"));
tabla.add(columna4); */

contenedor.add(titulo, BorderLayout.NORTH);
contenedor.add(tabla, BorderLayout.CENTER);
ventana.setVisible(true);
}

//M. ESTÁ DISPONIBLE
/* Método sincronizado que retorna el estado de disponibilidad del
Expand All @@ -21,6 +135,7 @@ public class ControladorSemaforos {
//Método sincronizado que marca el controlador como disponible.
public synchronized void liberar() {
disponible = true;
notify();
}

//M. SOLICITAR DISPONIBLE
Expand Down
6 changes: 3 additions & 3 deletions src/PruebaSemaforo.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ public static void main (String[] args) {
ControladorSemaforos controladorCompartido = new ControladorSemaforos();

//Semáforos que utilizan el mismo controlador
Semaforo s1 = new Semaforo(controladorCompartido, "Semaforo 1");
Semaforo s2 = new Semaforo(controladorCompartido, "Semaforo 2");
Semaforo s3 = new Semaforo(controladorCompartido, "Semaforo 3");
Semaforo s1 = new Semaforo(controladorCompartido);
Semaforo s2 = new Semaforo(controladorCompartido);
Semaforo s3 = new Semaforo(controladorCompartido);

//Ejecución de los semáforos
//Nota: se llama el método "start" y no "run" para que la ejecución sea concurrente
Expand Down
115 changes: 80 additions & 35 deletions src/Semaforo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,84 @@
/* Clase semáforo que se puede ejecutar en un proceso independiente, la clase tiene como
* atributo el objeto controlador que se utiliza para sincronizar multiples instacias de
* esta clase.*/

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Map;

public class Semaforo extends Thread { //Para poderse ejecutar en otro hilo se extiende la clase thread
public static final Map <Color, String> COLORES = Map.of(Color.GREEN, "Verde", Color.YELLOW, "Amarillo", Color.RED, "Rojo");
private ControladorSemaforos controladorCompartido; // Referencia al controlador compartido
private JFrame ventana = new JFrame("Semáforo");
private Foco[] focos = new Foco[3];
private String nombre;
private boolean activo = false;
private Foco focoActivo;
private int id;

public class Foco extends JPanel {
Color colorEncendido, colorApagado, colorActivo;
String nombreColor;

Foco(Color color, Color fondo){
setBackground(fondo);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
colorEncendido = color;
colorApagado = colorEncendido.darker().darker().darker();
colorActivo = colorApagado;
nombreColor = Semaforo.COLORES.get(color);
}

public void encenderExclusivo() {
for (Foco foco : focos) {
if (foco != this) {
foco.colorActivo = foco.colorApagado;
} else {
foco.colorActivo = foco.colorEncendido;
focoActivo = foco;
nombreColor = Semaforo.COLORES.get(colorActivo);
}
}
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(Color.BLACK);
//g.drawRect(0, 0, getWidth(), getHeight());
g.setColor(colorActivo);
g.fillOval((int)(getWidth()*.05), (int)(getHeight()*.05), (int)(getWidth()*.9), (int)(getHeight()*.9));
}
}

//CONSTRUCTOR
public Semaforo(ControladorSemaforos controladorCompartido, String nombre) {
super(nombre);
public Semaforo(ControladorSemaforos controladorCompartido) {
this.controladorCompartido = controladorCompartido;
controladorCompartido.semáforosAgregados++;
id = controladorCompartido.semáforosAgregados;
nombre = "Semáforo " + id;
ventana = new JFrame(nombre);
super.setName(nombre);

Container panel = ventana.getContentPane();
panel.setLayout(new GridLayout(3, 0));
panel.setBackground(Color.DARK_GRAY);
panel.add(new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(ventana.getContentPane().getBackground());
g.setColor(Color.GREEN);
g.fillOval((int)(getWidth()*.05), (int)(getHeight()*.05), (int)(getWidth()*.9), (int)(getHeight()*.9));
}
});
panel.add(new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(ventana.getContentPane().getBackground());
g.setColor(Color.YELLOW);
g.fillOval((int)(getWidth()*.05), (int)(getHeight()*.05), (int)(getWidth()*.9), (int)(getHeight()*.9));
}
});
panel.add(new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(ventana.getContentPane().getBackground());
g.setColor(Color.RED);
g.fillOval((int)(getWidth()*.05), (int)(getHeight()*.05), (int)(getWidth()*.9), (int)(getHeight()*.9));
}
});
panel.add(focos[0] = new Foco(Color.GREEN, panel.getBackground()));
panel.add(focos[1] = new Foco(Color.YELLOW, panel.getBackground()));
panel.add(focos[2] = new Foco(Color.RED, panel.getBackground()));
ventana.setSize(200, 600);
ventana.setResizable(false);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ventana.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ventana.setContentPane(panel);
ventana.setVisible(true);

focoActivo = focos[2];
controladorCompartido.tabla.agregarFila(getInformación());
}

//M. RUN
Expand All @@ -67,18 +93,29 @@ public void run() {
/* Bloque "if" que solo se ejecuta si el hilo es capaz de reclamar la
* disponibilidad del controlador.*/
if (controladorCompartido.solicitarDisponible()) {
activo = true;
focos[0].encenderExclusivo();
controladorCompartido.tabla.actualizarFila(id, getInformación());
ventana.repaint();
System.out.println("Verde");
sleep(2000); // Dormir por 2 segundos
focos[1].encenderExclusivo();
controladorCompartido.tabla.actualizarFila(id, getInformación());
ventana.repaint();
System.out.println("Amarillo");
sleep(3000);
focos[2].encenderExclusivo();
activo = false;
controladorCompartido.tabla.actualizarFila(id, getInformación());
ventana.repaint();
System.out.println("Rojo");
//sleep(500); // Dormir por .5 segundos
System.err.println(getName() + " Finalizado.");

/* Llamada para liberar el controlador al finalizar la ejecución de
* la funcionalidad de la clase.*/
* la funcionalidad de la clase.*/
controladorCompartido.liberar();
break; // Salir del ciclo
sleep(500); // Dormir por .5 segundos
//break; // Salir del ciclo
}
}
} catch (InterruptedException e) {
Expand All @@ -97,4 +134,12 @@ public void run() {
ex.printStackTrace();
} */
}

public String[] getInformación() {
String[] info = new String[3];
info[0] = nombre;
info[1] = activo ? "Activo" : "Esperando";
info[2] = focoActivo.nombreColor;
return info;
}
}

0 comments on commit e5fa27a

Please sign in to comment.