Está en la página 1de 7

Tarea 08. Interfaces. Swing y JavaFX.

Sudoku (I)
Abordamos la parte final del curso con nuevos conceptos que nos facilitan la
interacción con el programa a través de interfaces (Swing y JavaFX) y gestionar la
persistencia de datos del programa de modo eficiente, mediante el uso de sistemas
gestores de base de datos. De momento, realizaremos una interface gráfica en Swing
de la aplicación de Sudoku, con la que hemos trabajado a lo largo del curso.
La tarea de esta unidad se compone de dos partes:

- Creación de la interface gráfica en Swing del Sudoku (parte I).


- Integración de la vista (interface gráfica) creada en este apartado al modelo del
Sudoku que hemos creado (con mejoras para resolverlo, optimización y gestión de
errores), siguiendo el patrón MVC (Modelo-Vista-Controlador).

Los iconos de la interfaz gráfica se proporcionan en el enunciado de la propia


tarea (podéis usar otros, pero siempre cumpliendo las demandas de la presente
tarea). Además, se proporcionará ayuda adicional, para resolver temas concretos de la
práctica.
La vista debe tener un aspecto similar a lo siguiente:

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


1
Y debe cumplir los siguientes requisitos:

- IMPORTANTE: toda la apariencia gráfica debe realizarse de modo manual, sin


el uso de ningún asistente, ni los del propio Netbeans [*]. Si la tarea se resuelve
por medio del asistente no será evaluada, pues se trata de aprender los
conceptos de herencia (de contenedores), composición, gestión de eventos,…
para que, si en un futuro se desea realizar por medio de un asistente,
entendamos cada una de la partes de la generación automática de código.
[*] Usaremos el Netbeans para editar el código, pero los componentes
gráficos no se podrán hacer con “New -> JFrame Form…” o similar

- La ventana principal debe heredar de JFrame, no contenerlo (composición),


pues la ventana del Sudoku ES una ventana (hereda de JFrame): public class
JFSudoku extends JFrame { …}

- (Recomendación). En la medida de lo posible, los eventos deben gestionarse


sin emplear clases anónimas, para poder reutilizar el código y que un mismo
objeto pueda escuchar los eventos de varios objetos a la vez.
Los eventos de ventana los escuchará la propia ventana. El resto de
eventos pueden ser escuchados por la propia ventana o resuelto con
objetos/clases anónimas, interfaces, programación funcional, etc. Como te
resulte más cómodo.

- Las clases de la vista, de esta parte de la tarea, deben estar dentro del paquete
local.<TuNombre>.sudoku.vista.

- Al pulsar en la X de la ventana no debe cerrar el programa, debe mostrar una


ventana emergente preguntando la opción de si se desea salir:

Ayuda:
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
JOptionPane.showConfirmDialog(…)

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


2
- Los elementos centrales de la ventana, las celdas, deben estar dentro de un
Panel. Créese una clase PanelSudoku que herede de JPanel y, en ella, añádase
un array de dos dimensiones con cada una de las celdas: JTextField[][] txtCelas;
Créese métodos en el panel:
o clear(), para limpiar el contenido de las celdas;
o public boolean loadFromTxtFile(String sudokuFileName), que muestra
un mensaje de “Cargado Sudoku de texto”.
o public boolean loadSudoku(File f), que muestre otro mensaje.

- Debe tener el siguiente menú:

- Al seleccionar los tres primeros elementos del menú “cargar, guardar e


importar”, debe abrir una ventana de diálogo de archivo. “Cargar” e “Importar
para abrir un archivo y “Guardar” para salvarlo. Invocando a los métodos
correspondientes de PanelSudoku.

Además, deben mostrar el nombre del archivo seleccionado.

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


3
- La parte superior debe tener un JToolBar con tres JButton y un separador:

Cada botón debe tener una imagen (icono) de tipo ImageIcon, cuyo
archivo asociado debe estar en una carpeta de recursos de Maven.
Ayuda:
new ImageIcon(JFSudoku.class.getResource("/iconos/comprobar.png")) o
new ImageIcon(this.getClass().getResource("/iconos/resolver.png"));

En la que los iconos deben estar en la carpeta de recursos de Maven para


poder leerlos correctamente (consulta cómo hacerlo).

Al pulsar en el primer botón debe limpiar las celdas. Al pulsar en el


segundo y tercer botón debe mostrar un mensaje emergente “Comprobar” y
“Resolver”.

- Al seleccionar cada una de las opciones del tamaño del menú (4x4, 9x9, 16x16),
debe cambiar el número de celdas del PanelSudodu

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


4
ENTREGA

Debe crearse un fichero PDF con el código.


El pdf, además del código, debe mostrar capturas del código ejecutado, imprimiendo
las ventanas más importantes: ventana principal, control de cierre del programa, etc.
Además, debe añadirse el proyecto de Netbeans.

La entrega se realizará en un único archivo ZIP que se nombrará siguiendo las


siguientes pautas:
Apellido1Apellido2NombrePROG08.zip (o *.7zip)

Sin espacios ni caracteres espaciales como ñ, acentos, etc. Por ejemplo, Johann
Nepomuk Mäzel enviaría un archivo con el nombre:

JohannNepomukMazel.pdf

EVALUACIÓN

Habrá 3 niveles de evaluación:

NO APTO: cuando no se ha cubierto el 50% de la tarea.


APROBADO (6): cuando se ha cubierto gran parte de la tarea y los errores no son
graves.
SOBRESALIENTE (10): cuando se han realizado la mayor parte de la tarea (>80%),
aunque incluya algún pequeño error.

Cualquier código copiado de un compañero o de Internet (por supuesto, se debe


consultar y hacer uso de código de ayuda, pero sin copias exactas) será evaluado con un cero
(NO APTO)

AYUDA Y SUGERENCIAS

Colecciones estáticas

Aunque en esta tarea no es preciso, a veces, puede ser más cómodo y útil,
cuando los elementos son compartidos por varias ventanas u otras clases, por toda la
aplicación (constantes, iconos…), crear propiedades estáticas. Sin embargo, en el caso
de colecciones, crear una lista/mapa estático precisa añadir elementos a esa lista.

Si deseamos que la lista sea “final” y que tenga los elementos hay muchos

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


5
modos de iniciar la lista:

(1) Crear un bloque estático. Los bloques estáticos se ejecutan durante la carga de
la clase en memoria, después de la iniciar las variables estáticas:
public class Clase {
private static final Map<Integer, String> mapa;

static {
mapa = new HashMap<>();
mapa.put(1, "uno");
mapa.put(2, "dos");
}
// …
}

Además, para asegurar que no se modifican después (que se añadan


elementos o borren), se puede crear una colección “inmutable”, añadiendo en el
bloque estático la línea:

mapa = Collections.unmodifiableMap(mapa);

(2) Emplear un método estático para iniciar la colección:


import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

class Clase {
private static final Map<Integer, String> mapa = iniciarHashMap();

private static Map<Integer, String> iniciarHashMap() {


Map<Integer, String> mapa = new HashMap();
map.put(1, "uno");
map.put(2, "dos");
return Collections.unmodifiableMap(mapa);
}

public static void main(String[] args) {


System.out.println(mapa);
}
}
(3) Con el API de Stream (Java 8+):

Podemos usar Java 8 Stream API para construir mapas estáticos


haciendo uso de los métodos estáticos para construir objetos (patrón Factory):
Stream.of() o Arrays.stream() y acumulando los elementos de entrada en un
nuevo mapa usando colectores:
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

class Clase {
private static final Map<String, String> mapa =

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


6
Arrays.stream(new String[][]{
{"1", "uno"},
{"2", "dos"}
}).collect(Collectors.toMap(
claveMapa -> claveMapa[0],
valorMapa -> valorMapa[1]));

public static void main(String[] args) {


System.out.println(mapa);
}
}

Pepe Calo - Tarea 08. Interfaces Swing. Sudoku (I)


7

También podría gustarte