-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathColas.java
More file actions
344 lines (301 loc) · 13.4 KB
/
Colas.java
File metadata and controls
344 lines (301 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
// Importación de librerías necesarias
import javax.swing.*; // Para la interfaz gráfica
import java.awt.*; // Para componentes adicionales de GUI
import java.util.LinkedList; // Para implementar la cola
import java.util.Queue; // Interface para la cola
import java.util.Scanner; // Para entrada de datos por consola
import java.time.LocalDateTime; // Para manejar fechas y horas
import java.time.format.DateTimeFormatter; // Para formatear fechas
// Clase para crear la ventana que muestra la cola de impresión
class VentanaCola extends JFrame {
private JTextArea areaTexto; // Área donde se mostrará la información
private Timer timer; // Temporizador para actualizar la ventana
public VentanaCola() {
// Configuración básica de la ventana
setTitle("Cola de Impresión");
setSize(500, 400);
setLocationRelativeTo(null); // Centra la ventana en la pantalla
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // Comportamiento al cerrar
// Configuración del área de texto
areaTexto = new JTextArea();
areaTexto.setEditable(false); // Evita que el usuario modifique el texto
areaTexto.setFont(new Font("Monospaced", Font.PLAIN, 12));
// Agregar barra de desplazamiento al área de texto
JScrollPane scrollPane = new JScrollPane(areaTexto);
add(scrollPane);
// Configurar temporizador para actualizar cada segundo
timer = new Timer(1000, e -> this.repaint());
timer.start();
}
// Método para actualizar el contenido de la ventana
public void actualizarCola(String informacion) {
areaTexto.setText(informacion);
}
// Sobrescribir el método dispose para detener el timer al cerrar
@Override
public void dispose() {
timer.stop();
super.dispose();
}
}
// Clase para representar un documento a imprimir
class Documento {
private String nombre;
private String tipo;
private int numPaginas;
private String computadoraOrigen;
private LocalDateTime horaEntrada;
private int tiempoEstimado;
private int paginasImpresas;
private boolean enImpresion;
// Constructor del documento
public Documento(String nombre, String tipo, int numPaginas, String computadoraOrigen) {
this.nombre = nombre;
this.tipo = tipo;
this.numPaginas = numPaginas;
this.computadoraOrigen = computadoraOrigen;
this.horaEntrada = LocalDateTime.now();
this.paginasImpresas = 0;
this.enImpresion = false;
calcularTiempoEstimado();
}
// Calcula el tiempo estimado según el tipo de documento
private void calcularTiempoEstimado() {
switch (tipo) {
case "Texto": tiempoEstimado = numPaginas * 2; break;
case "Imagen": tiempoEstimado = numPaginas * 4; break;
case "PDF": tiempoEstimado = numPaginas * 3; break;
case "Presentación": tiempoEstimado = numPaginas * 5; break;
}
}
// Métodos getter y setter
public String getNombre() { return nombre; }
public String getTipo() { return tipo; }
public int getNumPaginas() { return numPaginas; }
public String getComputadoraOrigen() { return computadoraOrigen; }
public LocalDateTime getHoraEntrada() { return horaEntrada; }
public int getTiempoEstimado() { return tiempoEstimado; }
public int getPaginasImpresas() { return paginasImpresas; }
public void setPaginasImpresas(int paginas) { this.paginasImpresas = paginas; }
public boolean isEnImpresion() { return enImpresion; }
public void setEnImpresion(boolean enImpresion) { this.enImpresion = enImpresion; }
}
// Clase principal que maneja la impresora
class ImpresoraRed {
private Queue<Documento> colaImpresion; // Cola de documentos
private String estado; // Estado actual de la impresora
private int documentosImpresos; // Contador de documentos impresos
private Thread hiloImpresion; // Hilo para proceso de impresión
private boolean imprimiendo; // Bandera de estado de impresión
private DateTimeFormatter formatoHora; // Formateador de hora
private VentanaCola ventanaCola; // Ventana para mostrar la cola
private Documento documentoActual; // Documento en impresión actual
// Constructor de la impresora
public ImpresoraRed() {
this.colaImpresion = new LinkedList<>();
this.estado = "Disponible";
this.documentosImpresos = 0;
this.imprimiendo = false;
this.formatoHora = DateTimeFormatter.ofPattern("HH:mm:ss");
this.ventanaCola = new VentanaCola();
}
// Método para agregar un documento a la cola
public synchronized void agregarDocumento(Documento documento) {
colaImpresion.offer(documento);
System.out.println("\nDocumento agregado a la cola: " + documento.getNombre());
// Inicia la impresión si no hay documentos imprimiéndose
if (!imprimiendo) {
iniciarProcesoImpresion();
}
actualizarVentanaCola();
}
// Inicia el proceso de impresión en un hilo separado
private void iniciarProcesoImpresion() {
if (hiloImpresion == null || !hiloImpresion.isAlive()) {
imprimiendo = true;
hiloImpresion = new Thread(() -> {
while (!colaImpresion.isEmpty()) {
imprimirSiguiente();
actualizarVentanaCola();
}
imprimiendo = false;
documentoActual = null;
actualizarVentanaCola();
});
hiloImpresion.start();
}
}
// Método para imprimir el siguiente documento en la cola
private void imprimirSiguiente() {
if (colaImpresion.isEmpty()) return;
estado = "Ocupada";
documentoActual = colaImpresion.peek();
documentoActual.setEnImpresion(true);
// Simula la impresión página por página
for (int i = 1; i <= documentoActual.getNumPaginas(); i++) {
documentoActual.setPaginasImpresas(i);
actualizarVentanaCola();
try {
// Tiempo de espera según el tipo de documento
switch (documentoActual.getTipo()) {
case "Texto": Thread.sleep(2000); break;
case "Imagen": Thread.sleep(4000); break;
case "PDF": Thread.sleep(3000); break;
case "Presentación": Thread.sleep(5000); break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Finaliza la impresión del documento actual
colaImpresion.poll();
documentosImpresos++;
estado = "Disponible";
}
// Muestra la ventana de cola de impresión
public void mostrarCola() {
ventanaCola.setVisible(true);
actualizarVentanaCola();
}
// Actualiza la información mostrada en la ventana
private void actualizarVentanaCola() {
StringBuilder info = new StringBuilder();
// Agrega información del estado de la impresora
info.append("=== Estado de la Impresora ===\n");
info.append("Estado: ").append(estado).append("\n");
info.append("Documentos impresos: ").append(documentosImpresos).append("\n\n");
// Muestra información del documento en impresión
if (documentoActual != null) {
info.append("=== Documento en Impresión ===\n");
info.append("Nombre: ").append(documentoActual.getNombre()).append("\n");
info.append("Progreso: ").append(documentoActual.getPaginasImpresas())
.append("/").append(documentoActual.getNumPaginas()).append(" páginas\n\n");
}
// Muestra información de la cola de impresión
info.append("=== Cola de Impresión ===\n");
if (colaImpresion.isEmpty()) {
info.append("No hay documentos en cola\n");
} else {
int posicion = 1;
int tiempoEspera = 0;
// Muestra información de cada documento en cola
for (Documento doc : colaImpresion) {
if (!doc.isEnImpresion()) {
info.append("\nPosición ").append(posicion).append(":\n");
info.append("Nombre: ").append(doc.getNombre()).append("\n");
info.append("Tipo: ").append(doc.getTipo()).append("\n");
info.append("Páginas: ").append(doc.getNumPaginas()).append("\n");
info.append("Origen: ").append(doc.getComputadoraOrigen()).append("\n");
info.append("Hora entrada: ").append(doc.getHoraEntrada().format(formatoHora)).append("\n");
info.append("Tiempo estimado: ").append(doc.getTiempoEstimado()).append(" segundos\n");
info.append("Tiempo de espera: ").append(tiempoEspera).append(" segundos\n");
tiempoEspera += doc.getTiempoEstimado();
posicion++;
}
}
}
// Actualiza la ventana en el hilo de la interfaz gráfica
SwingUtilities.invokeLater(() -> ventanaCola.actualizarCola(info.toString()));
}
}
// Clase principal del sistema
class SistemaImpresion {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ImpresoraRed impresora = new ImpresoraRed();
boolean ejecutar = true;
System.out.println("=== Sistema de Impresión en Red ===");
// Bucle principal del programa
while (ejecutar) {
mostrarMenu();
int opcion = leerOpcion(scanner);
switch (opcion) {
case 1:
agregarDocumento(scanner, impresora);
break;
case 2:
impresora.mostrarCola();
break;
case 3:
ejecutar = false;
System.out.println("\nSaliendo del sistema...");
break;
default:
System.out.println("\nOpción no válida. Por favor, intente de nuevo.");
}
}
scanner.close();
}
// Muestra el menú principal
private static void mostrarMenu() {
System.out.println("\n=== Menú Principal ===");
System.out.println("1. Agregar documento a la cola");
System.out.println("2. Ver estado de la impresora y cola");
System.out.println("3. Salir");
System.out.print("Seleccione una opción: ");
}
// Lee y valida la opción ingresada por el usuario
private static int leerOpcion(Scanner scanner) {
while (!scanner.hasNextInt()) {
System.out.println("Por favor, ingrese un número válido.");
scanner.next();
}
return scanner.nextInt();
}
// Método para agregar un nuevo documento
private static void agregarDocumento(Scanner scanner, ImpresoraRed impresora) {
scanner.nextLine(); // Limpiar el buffer
System.out.println("\n=== Agregar Nuevo Documento ===");
// Solicita el nombre del documento
System.out.print("Ingrese el nombre del documento: ");
String nombre = scanner.nextLine();
// Muestra tipos de documento disponibles
System.out.println("\nTipos de documento disponibles:");
System.out.println("1. Texto");
System.out.println("2. Imagen");
System.out.println("3. PDF");
System.out.println("4. Presentación");
// Selección y validación del tipo de documento
String tipo;
do {
System.out.print("Seleccione el tipo de documento (1-4): ");
int tipoNum = leerOpcion(scanner);
switch (tipoNum) {
case 1: tipo = "Texto"; break;
case 2: tipo = "Imagen"; break;
case 3: tipo = "PDF"; break;
case 4: tipo = "Presentación"; break;
default:
System.out.println("Opción no válida. Intente de nuevo.");
tipo = null;
}
} while (tipo == null);
// Solicita número de páginas
System.out.print("\nIngrese el número de páginas: ");
int paginas = leerOpcion(scanner);
// Muestra computadoras disponibles
System.out.println("\nComputadoras disponibles:");
System.out.println("1. PC1");
System.out.println("2. PC2");
System.out.println("3. PC3");
System.out.println("4. PC4");
// Selección y validación de la computadora
String computadora;
do {
System.out.print("Seleccione la computadora de origen (1-4): ");
int pcNum = leerOpcion(scanner);
switch (pcNum) {
case 1: computadora = "PC1"; break;
case 2: computadora = "PC2"; break;
case 3: computadora = "PC3"; break;
case 4: computadora = "PC4"; break;
default:
System.out.println("Opción no válida. Intente de nuevo.");
computadora = null;
}
} while (computadora == null);
// Crea y agrega el nuevo documento a la cola
Documento doc = new Documento(nombre, tipo, paginas, computadora);
impresora.agregarDocumento(doc);
}
}