Made the drawing for circular lists.

This commit is contained in:
Chris Cromer 2016-06-26 23:34:33 -04:00
parent 308c9b0fd9
commit 108eedaff2
5 changed files with 83 additions and 12 deletions

View File

@ -15,6 +15,7 @@
</properties>
<properties id="javafx-properties">
<options>
<option name="alias" value="" />
<option name="appClass" value="cl.cromer.estructuras.Main" />
<option name="customManifestAttributes">
<list>
@ -29,8 +30,10 @@
</list>
</option>
<option name="description" value="" />
<option name="enabledSigning" value="true" />
<option name="height" value="768" />
<option name="htmlParamFile" value="" />
<option name="keystore" value="" />
<option name="nativeBundle" value="all" />
<option name="paramFile" value="" />
<option name="title" value="Estructuras de Datos" />

View File

@ -3,7 +3,11 @@ package cl.cromer.estructuras;
import javafx.animation.Animation;
import javafx.animation.PauseTransition;
import javafx.animation.SequentialTransition;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
@ -102,7 +106,7 @@ public class Grafico {
}
/**
* Crear una linea vertical
* Crear una linea vertical.
* @return StackPane: Devolver el stackpane que contiene la linea vertical.
*/
public static StackPane crearLineaVertical() {
@ -117,6 +121,45 @@ public class Grafico {
return stackPane;
}
/**
* Crear la linea circular con flecha.
* @param cajas int: La cantidad de cajas que están.
* @return StackPane: Devolver el stackpane que contiene la linea horizontal.
*/
public static Pane crearLineaCircular(int cajas) {
int height = (cajas - 1) * (40 + 20 + 10);
height = height + 20 + 10;
Line top = new Line();
top.setStartY(20);
top.setEndY(20);
top.setStartX(0);
top.setEndX(20);
Polygon flechaDerecha = new Polygon();
flechaDerecha.getPoints().addAll(
10.0, 15.0,
20.0, 20.0,
10.0, 25.0
);
Line vertical = new Line();
vertical.setStartY(20);
vertical.setEndY(height);
Line bottom = new Line();
bottom.setStartY(height);
bottom.setEndY(height);
bottom.setStartX(0);
bottom.setEndX(20);
Pane stackPane = new Pane();
stackPane.getChildren().addAll(top, flechaDerecha, vertical, bottom);
return stackPane;
}
/**
* Crear un rectangulo con texto adentro.
* @param colores Colores: Los colores para dar color al rectangulo.

View File

@ -3,6 +3,7 @@ package cl.cromer.estructuras;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
@ -29,6 +30,11 @@ public class ListaEnlazdaController implements Initializable {
*/
@FXML private VBox contenidoLista;
/**
* Donde poner el contenido de lista circular.
*/
@FXML private VBox contenidoListaCircular;
/**
* Donde va el codigo a mostrar a la pantalla.
*/
@ -331,19 +337,20 @@ public class ListaEnlazdaController implements Initializable {
grafico.removerDestacar();
colores = new Colores();
contenidoLista.getChildren().clear();
contenidoListaCircular.getChildren().clear();
if (listaEnlazadaTipos.getTipo() != ListaEnlazadaTipos.CIRCULAR) {
for (int i = 0; i < listaEnlazada.size(); i++) {
Enlace enlace = listaEnlazada.getIndice(i);
if (listaEnlazada.getTipo() == ListaEnlazadaTipos.SIMPLE) {
dibujarSimple(enlace);
dibujarSimple(enlace, false);
}
else if (listaEnlazada.getTipo() == ListaEnlazadaTipos.DOBLEMENTE_ENLAZADA) {
if (i != listaEnlazada.size() - 1) {
dibujarDoble(enlace);
dibujarDoble(enlace, (i == 0));
}
else {
dibujarSimple(enlace);
dibujarSimple(enlace, false);
}
}
colores.siguinteColor();
@ -352,9 +359,12 @@ public class ListaEnlazdaController implements Initializable {
else {
for (int i = 0; i < listaEnlazadaCircular.size(); i++) {
Enlace enlace = listaEnlazadaCircular.getIndice(i);
dibujarSimple(enlace);
dibujarSimple(enlace, (i == listaEnlazadaCircular.size() - 1));
colores.siguinteColor();
}
if (listaEnlazadaCircular.size() > 0) {
contenidoListaCircular.getChildren().addAll(Grafico.crearLineaCircular(listaEnlazadaCircular.size()));
}
}
}
@ -362,19 +372,29 @@ public class ListaEnlazdaController implements Initializable {
* Dibujarlo con una flecha.
* @param enlace Object: El enlace que tiene la llave y valor.
*/
private void dibujarSimple(Enlace enlace) {
private void dibujarSimple(Enlace enlace, boolean sinFlecha) {
contenidoLista.getChildren().addAll(
Grafico.crearCaja(colores, String.valueOf(enlace.getLlave()), String.valueOf(enlace.getLlave()))
);
if (!sinFlecha) {
contenidoLista.getChildren().addAll(
Grafico.crearCaja(colores, String.valueOf(enlace.getLlave()), String.valueOf(enlace.getLlave())),
Grafico.crearLineaVertical(),
Grafico.crearFlechaAbajo()
);
}
}
/**
* Dibujarlo con dos flechas.
* @param enlace El enlace que tiene la llave y valor.
*/
private void dibujarDoble(Enlace enlace) {
private void dibujarDoble(Enlace enlace, boolean primer) {
if (primer) {
contenidoLista.getChildren().addAll(
Grafico.crearFlechaArriba(),
Grafico.crearLineaVertical()
);
}
contenidoLista.getChildren().addAll(
Grafico.crearCaja(colores, String.valueOf(enlace.getLlave()), String.valueOf(enlace.getLlave())),
Grafico.crearFlechaArriba(),

View File

@ -16,6 +16,8 @@ import java.util.Optional;
import java.util.ResourceBundle;
import java.util.logging.Level;
import static cl.cromer.estructuras.ListaEnlazadaTipos.SIMPLE;
/**
* Controlar las acciones cuando una opción es elegido en el menu.
*/
@ -145,7 +147,7 @@ public class MenuController extends VBox implements Initializable {
*/
@FXML
protected void menuListaEnlazadaSimple() {
ListaEnlazadaTipos listaEnlazadaTipos = new ListaEnlazadaTipos(ListaEnlazadaTipos.SIMPLE);
ListaEnlazadaTipos listaEnlazadaTipos = new ListaEnlazadaTipos(SIMPLE);
loadStage(
resourceBundle.getString("tituloListaEnlazadaSimple"),
"/cl/cromer/estructuras/fxml/listaEnlazada.fxml",

View File

@ -20,7 +20,10 @@
<Button text="%buscar" onAction="#botonBuscar" />
<TextFieldLimited fx:id="valorLista" maxLength="2" prefWidth="40" />
</HBox>
<VBox fx:id="contenidoLista" alignment="CENTER" />
<HBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" spacing="0">
<VBox fx:id="contenidoListaCircular" alignment="TOP_LEFT" />
<VBox fx:id="contenidoLista" alignment="TOP_CENTER" />
</HBox>
</VBox>
<StackPane alignment="TOP_LEFT" minWidth="450">
<Text fx:id="codigoLista" />