Finished individual and cleaned up code

This commit is contained in:
2017-07-07 00:39:13 -04:00
parent 391450ec1c
commit 19a180143c
93 changed files with 3770 additions and 1073 deletions

View File

@@ -12,9 +12,8 @@ import org.w3c.dom.Document;
import java.util.ArrayList;
/**
* Clase que contiene método que guarda y ordena cada transición del archivo XML ya validado
* Clase que contiene métodos que guarda y ordena cada transición del archivo XML ya validado
*/
public class Automata {
private ArrayList<Estado> estados;
private ArrayList<Integer> estadosExistentes;
@@ -25,30 +24,28 @@ public class Automata {
*
* @param document Document del XML
*/
public Automata(Document document) {
setEstados(new ArrayList<>());
for (int i = 0; i < document.getElementsByTagName("transicion").getLength(); i++) {
char move = document.getElementsByTagName("movimiento").item(i).getTextContent().charAt(0);
if (move == 'E' || move == 'R' || move == 'L' || move == '*') {
char mover = document.getElementsByTagName("movimiento").item(i).getTextContent().charAt(0);
if (mover == 'E' || mover == 'R' || mover == 'L' || mover == '*' || mover == 'S') {
int qi = Integer.parseInt(document.getElementsByTagName("qi").item(i).getTextContent());
int qj = Integer.parseInt(document.getElementsByTagName("qj").item(i).getTextContent());
char si = document.getElementsByTagName("si").item(i).getTextContent().charAt(0);
char sj = document.getElementsByTagName("sj").item(i).getTextContent().charAt(0);
if (estados.size() <= qi) {
estados.add(qi, new Estado(qi));
if (getEstados().size() <= qi) {
getEstados().add(qi, new Estado(qi));
}
if (estados.size() <= qj) {
estados.add(qj, new Estado(qj));
if (getEstados().size() <= qj) {
getEstados().add(qj, new Estado(qj));
}
estados.get(qi).createLink(si, estados.get(qj), sj, move);
getEstados().get(qi).crearEnlace(si, getEstados().get(qj), sj, mover);
}
else {
System.out.println("Movimiento invalido de cinta");
System.exit(1);
}
}
estadosExistentes = new ArrayList<>();
setEstadosExistentes(new ArrayList<>());
for (int i = 0; i < getEstados().size(); i++) {
if (getEstados().get(i) != null) {
getEstadosExistentes().add(getEstados().get(i).getQ());
@@ -86,7 +83,7 @@ public class Automata {
/**
* Asigna una lista de estados existentes
*
* @param estadosExistentes
* @param estadosExistentes Los estados a guardar
*/
public void setEstadosExistentes(ArrayList<Integer> estadosExistentes) {
this.estadosExistentes = estadosExistentes;

View File

@@ -19,13 +19,13 @@ public class Enlace {
/**
* Contructor de la clase
*
* @param si Simbolo a analizar en la cadena
* @param qj Estado con que se enlaza
* @param sj Simbolo a escribir en la cadena
* @param move Movimiento del indice de la cadena
* @param si Simbolo a analizar en la cadena
* @param qj Estado con que se enlaza
* @param sj Simbolo a escribir en la cadena
* @param mover Movimiento del indice de la cadena
*/
public Enlace(char si, Estado qj, char sj, char move) {
setMovimiento(move);
public Enlace(char si, Estado qj, char sj, char mover) {
setMovimiento(mover);
setSj(sj);
setQj(qj);
setSi(si);
@@ -43,7 +43,7 @@ public class Enlace {
/**
* Asigna simbolo a analizar
*
* @param si
* @param si simbolo
*/
private void setSi(char si) {
this.si = si;
@@ -61,7 +61,7 @@ public class Enlace {
/**
* Asigna simbolo a escribir
*
* @param sj
* @param sj simbolo
*/
public void setSj(char sj) {
this.sj = sj;

View File

@@ -49,20 +49,18 @@ public class Estado {
* @param si Simbolo a analizar en la cadena
* @param qj Estado adyacente
* @param sj Simbolo que escribe en la cadena
* @param move Movimiento del cabezal (indice de la cadena)
* @return Verdadero si se creó, falso si ya existe
* @param mover Movimiento del cabezal (indice de la cadena)
*/
public boolean createLink(char si, Estado qj, char sj, char move) {
public void crearEnlace(char si, Estado qj, char sj, char mover) {
if (enlaces.isEmpty()) {
enlaces.add(new Enlace(si, qj, sj, move));
enlaces.add(new Enlace(si, qj, sj, mover));
}
for (Enlace aLink : enlaces) {
if (aLink.getSi() == si) {
return false;
for (Enlace enlace : enlaces) {
if (enlace.getSi() == si) {
return;
}
}
enlaces.add(new Enlace(si, qj, sj, move));
return true;
enlaces.add(new Enlace(si, qj, sj, mover));
}
/**

View File

@@ -15,7 +15,6 @@ import java.util.ArrayList;
public class EstadosFinales {
private ArrayList<Integer> estadosExistentes;
private ArrayList<Integer> estadosElegidos;
private Maquina maquina;
/**
@@ -78,4 +77,4 @@ public class EstadosFinales {
public void setMaquina(Maquina maquina) {
this.maquina = maquina;
}
}
}

View File

@@ -22,7 +22,6 @@ import java.util.ArrayList;
public class EstadosFinalesController {
@FXML
private VBox contenido;
private EstadosFinales estadosFinales;
/**
@@ -68,4 +67,4 @@ public class EstadosFinalesController {
contenido.getChildren().add(hBox);
}
}
}
}

View File

@@ -0,0 +1,197 @@
/* Copyright (c) 2017 Christopher Cromer
* Copyright (c) 2017 Carlos Faúndez
*
* This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
* This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
*/
package cl.cromer.mt;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class IndividualController extends VBox {
@FXML
private VBox contenido;
@FXML
private TextField cadena;
@FXML
private HBox cinta;
@FXML
private Button aceptar;
@FXML
private Button paso;
@FXML
private Text estadoActual;
@FXML
private Text estadoPrevio;
@FXML
private Text simboloLeido;
@FXML
private Text simboloEscrito;
@FXML
private Text movimiento;
private String cadenaAceptada;
private EstadosFinales estadosFinales;
private Maquina maquina;
private int cabezalAnterior;
private int cajas;
private int estadoPrevioi;
private char simboloAnterior;
/**
* Este metodo se crea una caja para poner un simbolo de la cinta
*
* @param label El label para encontrar la caja despues
* @param texto El simbolo de la cinta
*
* @return Retorna un StackPane que contiene la caja
*/
private static StackPane crearCaja(String label, String texto) {
Rectangle rectangle = new Rectangle();
rectangle.setHeight(20);
rectangle.setWidth(20);
rectangle.setFill(Color.WHITE);
rectangle.setStroke(Color.BLACK);
rectangle.setId("caja_" + label);
Text text = new Text();
text.setId("simbolo_" + label);
text.setStroke(Color.BLACK);
text.setText(texto);
StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(rectangle, text);
return stackPane;
}
/**
* Boton de aceptar cadena
*/
@FXML
protected void aceptarCadena() {
Scene scene = contenido.getScene();
estadosFinales = (EstadosFinales) scene.getUserData();
maquina = estadosFinales.getMaquina();
cadenaAceptada = cadena.getText();
StringBuilder temp = new StringBuilder(cadenaAceptada);
temp.insert(0, "#");
temp.insert(cadenaAceptada.length() + 1, "#");
cadenaAceptada = temp.toString();
for (int i = 0; i < cadenaAceptada.length(); i++) {
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(cadenaAceptada.charAt(i))));
cajas = i + 1;
}
Rectangle rectangle = (Rectangle) scene.lookup("#caja_1");
rectangle.setFill(Color.BLUE);
Text simbolo = (Text) scene.lookup("#simbolo_1");
simbolo.setStroke(Color.WHITE);
cadena.setText("");
cadena.setDisable(true);
aceptar.setDisable(true);
paso.setDisable(false);
cabezalAnterior = 1;
estadoPrevioi = 0;
estadoActual.setText("Estado actual: q" + maquina.getEstadoActual().getQ());
estadoPrevio.setText("Estado previo: q" + estadoPrevioi);
simboloLeido.setText("Simbolo leido: #");
simboloEscrito.setText("Simbolo escrito: #");
movimiento.setText("Movimiento: #");
}
/**
* Boton de cerrar
*/
@FXML
protected void paso() {
Scene scene = contenido.getScene();
int resultado = maquina.comprobarCadenaS2S(new StringBuilder(cadenaAceptada), estadosFinales.getEstadosElegidos().stream().mapToInt(i -> i).toArray());
if (resultado == 1) {
MT.mostrarMensaje("Resultado", "La cadena fue aceptada!");
cadena.setDisable(false);
aceptar.setDisable(false);
paso.setDisable(true);
maquina.reset();
}
else if (resultado == -1) {
MT.mostrarMensaje("Resultado", "La cadena fue rechazada!");
cadena.setDisable(false);
aceptar.setDisable(false);
paso.setDisable(true);
maquina.reset();
}
else {
if (maquina.getCintaAnterior().length() > cajas) {
for (int i = cajas; i < maquina.getCintaAnterior().length(); i++) {
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(maquina.getCintaAnterior().charAt(i))));
}
}
for (int i = 0; i < maquina.getCintaAnterior().length(); i++) {
Text simbolo = (Text) scene.lookup("#simbolo_" + i);
if (i == maquina.getCabezal()) {
simboloAnterior = simbolo.getText().charAt(0);
}
simbolo.setText(String.valueOf(maquina.getCintaAnterior().charAt(i)));
}
// Undo cabezel anterior
Rectangle rectangle = (Rectangle) scene.lookup("#caja_" + cabezalAnterior);
rectangle.setFill(Color.WHITE);
Text simbolo = (Text) scene.lookup("#simbolo_" + cabezalAnterior);
simbolo.setStroke(Color.BLACK);
estadoActual.setText("Estado actual: q" + maquina.getEstadoActual().getQ());
estadoPrevio.setText("Estado previo: q" + estadoPrevioi);
simboloLeido.setText("Simbolo leido: " + simboloAnterior);
simboloEscrito.setText("Simbolo escrito: " + simbolo.getText());
movimiento.setText("Movimiento: " + maquina.getEnlaceActual().getMovimiento());
// Cabezel
rectangle = (Rectangle) scene.lookup("#caja_" + maquina.getCabezal());
rectangle.setFill(Color.BLUE);
simbolo = (Text) scene.lookup("#simbolo_" + maquina.getCabezal());
simbolo.setStroke(Color.WHITE);
cabezalAnterior = maquina.getCabezal();
estadoPrevioi = maquina.getEstadoActual().getQ();
}
}
/**
* Boton de cerrar
*/
@FXML
protected void cerrar() {
Scene scene = contenido.getScene();
Stage stage = (Stage) scene.getWindow();
stage.close();
}
}

View File

@@ -9,14 +9,16 @@ package cl.cromer.mt;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.print.Doc;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
/**
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase_.dtd
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase.dtd
*/
class LeerXML {
/**
@@ -61,6 +63,7 @@ class LeerXML {
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(new CustomErrorHandler());
documento = db.parse(archivo);
documento.getDocumentElement().normalize();
if(validarEtiquetas(documento)){
@@ -116,10 +119,10 @@ class LeerXML {
BufferedReader br = new BufferedReader(new FileReader(original));
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
if ((aux = br.readLine()).startsWith("<?xml")) {
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase.dtd\">");
}
else {
bw.write("<!DOCTYPE root SYSTEM \"mtbase_.dtd\">\n" + aux);
bw.write("<!DOCTYPE root SYSTEM \"mtbase.dtd\">\n" + aux);
}
for (aux = ""; aux != null; aux = br.readLine()) {
if (!aux.startsWith("<!DOCTYPE")) {
@@ -135,11 +138,11 @@ class LeerXML {
}
/**
* Valida las etiquetas en el XML
* Validar las etiquetas en el XML
*
* @param document XML a analizar
*
* @return Verdadero si esta correcto, caso contrario falso
* @return Verdadero si está correcto, caso contrario falso
*/
private boolean validarEtiquetas(Document document) {
NodeList etiquetas = document.getElementsByTagName("*");
@@ -165,4 +168,47 @@ class LeerXML {
}
return true;
}
/**
* Esta clase es para manejar problemas en los archivo .xml
*/
public class CustomErrorHandler implements ErrorHandler {
/**
* Errores fatales, el archivo es invalido.
*
* @param exception La excepción
*
* @throws SAXException La SAX excepción
*/
@Override
public void warning(SAXParseException exception) throws SAXException {
//System.out.println("Warning: " + exception);
// No es fatal, sigue
}
/**
* Errores fatales, el archivo es invalido.
*
* @param exception La excepción
*
* @throws SAXException La SAX excepción
*/
@Override
public void error(SAXParseException exception) throws SAXException {
//System.out.println("Error: " + exception);
// No es fatal, sigue
}
/**
* Errores fatales, el archivo es invalido.
*
* @param exception La excepción
*
* @throws SAXException La SAX excepción
*/
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.err.println("Fatal error: " + exception);
}
}
}

View File

@@ -30,10 +30,9 @@ public class LoteController extends VBox {
/**
* Boton de run MT
* @throws Exception La excepción
*/
@FXML
protected void runLote() throws Exception {
protected void runLote() {
Scene scene = contenido.getScene();
EstadosFinales estadosFinales = (EstadosFinales) scene.getUserData();
Maquina maquina = estadosFinales.getMaquina();
@@ -54,7 +53,14 @@ public class LoteController extends VBox {
*/
@FXML
protected void agregarCadena() {
tablaData.add(new TablaData(cadena.getText(), ""));
StringBuilder temp = new StringBuilder(cadena.getText());
if (temp.charAt(0) != '#') {
temp.insert(0, "#");
}
if (temp.charAt(temp.length() - 1) != '#') {
temp.insert(temp.length(), "#");
}
tablaData.add(new TablaData(temp.toString(), ""));
Scene scene = contenido.getScene();
@SuppressWarnings("unchecked")
TableView<TablaData> tableView = (TableView<TablaData>) scene.lookup("#tableView");
@@ -72,4 +78,4 @@ public class LoteController extends VBox {
Stage stage = (Stage) scene.getWindow();
stage.close();
}
}
}

View File

@@ -47,7 +47,7 @@ public class MT extends Application {
}
/**
* Metodo de JavaFX llamada para generar el interfaz grafico.
* Metodo de JavaFX llamada para generar el interfaz grafico
* @param primaryStage La ventana principal
* @throws Exception La excepción
*/
@@ -64,4 +64,4 @@ public class MT extends Application {
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/cl/cromer/mt/images/icon.png")));
primaryStage.show();
}
}
}

View File

@@ -50,7 +50,7 @@ public class Maquina {
/**
* Asigna un estado actual que esta la maquina en un instante de tiempo
*
* @param estadoActual
* @param estadoActual En que estado es la maquina
*/
public void setEstadoActual(Estado estadoActual) {
this.estadoActual = estadoActual;
@@ -68,7 +68,7 @@ public class Maquina {
/**
* Asigna un enlace actual que esta la maquina en un instante de tiempo
*
* @param enlaceActual
* @param enlaceActual La enlace donde esta la maquina
*/
public void setEnlaceActual(Enlace enlaceActual) {
this.enlaceActual = enlaceActual;
@@ -85,7 +85,7 @@ public class Maquina {
/**
* Asigna la cadena anterior a que la maquina hiciera cambios
* @param cintaAnterior
* @param cintaAnterior La cinta a verificar
*/
public void setCintaAnterior(String cintaAnterior) {
this.cintaAnterior = cintaAnterior;
@@ -103,7 +103,7 @@ public class Maquina {
/**
* Asigna el indice en que se ubica en la cadena (Cabezal)
*
* @param cabezal
* @param cabezal Donde poner la cabezal
*/
public void setCabezal(int cabezal) {
this.cabezal = cabezal;
@@ -116,34 +116,31 @@ public class Maquina {
setEstadoActual(getMaquina().getEstados().get(0));
setEnlaceActual(null);
setCintaAnterior("");
setCabezal(0);
setCabezal(1);
}
/**
* Comprueba que si la cadena ingresada es reconocida por la maquina
*
* @param cinta cadena ingresada por el usuario
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
* @param estadosFinales Arreglo de estados finales, también ingresados por usuario
* @return Verdadero si lo reconoce, caso contrario, falso
*/
public boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) {
int i;
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
public boolean comprobarCadena(StringBuilder cinta, int[] estadosFinales) {
for (int i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
movimientoCabezal(getEnlaceActual().getMovimiento(), cinta);
setEstadoActual(getEnlaceActual().getQj());
i = -1;
}
}
for (i = 0; i < estadoFinal.length; i++) {
if (getEstadoActual().getQ() == estadoFinal[i]) {
reset();
for (int estadoFinal : estadosFinales) {
if (getEstadoActual().getQ() == estadoFinal) {
return true;
}
}
reset();
return false;
}
@@ -153,28 +150,32 @@ public class Maquina {
* un enlace actual
*
* @param cinta Cadena ingresada por el usuario
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
* @return
* @param estadosFinales Arreglo de estados finales, también ingresados por usuario
* @return Verdadero si reconce la cinta, sino falso
*/
public boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal) {
setCintaAnterior(cinta.toString());
int i;
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
public int comprobarCadenaS2S(StringBuilder cinta, int[] estadosFinales) {
if (cintaAnterior.equals("")) {
setCintaAnterior(cinta.toString());
}
else {
cinta = new StringBuilder(getCintaAnterior());
}
for (int i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
setEstadoActual(getEnlaceActual().getQj());
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
return true;
movimientoCabezal(getEnlaceActual().getMovimiento(), cinta);
setEstadoActual(getEnlaceActual().getQj());
setCintaAnterior(cinta.toString());
return 0;
}
}
for (i = 0; i < estadoFinal.length; i++) {
if (getEstadoActual().getQ() == estadoFinal[i]) {
setEnlaceActual(null); // Indicar que no hay más transiciones
return true;
for (int estadoFinal : estadosFinales) {
if (getEstadoActual().getQ() == estadoFinal) {
return 1;
}
}
return false;
return -1;
}
/**
@@ -182,25 +183,24 @@ public class Maquina {
* @param mov caracter asociado al movimiento
* @param cinta Cadena ingresada por el usuario
*/
private void movimientoCabezal(char mov,StringBuilder cinta) {
switch (mov) {
case 'L': {
setCabezal(getCabezal() - 1);
if (getCabezal() == (-1)) {
cinta.insert(0, "#");
private void movimientoCabezal(char mov, StringBuilder cinta) {
switch (mov) {
case 'L': {
setCabezal(getCabezal() - 1);
if (getCabezal() == (-1)) {
cinta.insert(0, "#");
setCabezal(getCabezal() + 1);
}
break;
}
case 'R': {
setCabezal(getCabezal() + 1);
if (getCabezal() == cinta.length()) {
cinta.insert(getCabezal(), "#");
}
break;
}
break;
default: {/*Se mantiene*/}
}
case 'R': {
setCabezal(getCabezal() + 1);
if (getCabezal() == cinta.length()) {
cinta.insert(getCabezal(), "#");
}
break;
}
default: {/*Se mantiene*/}
}
}
}
}

View File

@@ -36,19 +36,15 @@ import java.util.regex.Pattern;
* Controlar las acciones cuando una opción es elegido en el menu.
*/
public class MenuController {
private EstadosFinales estadosFinales;
private TableView<TablaData> tableView;
@FXML
private MenuBar menuBar;
@FXML
private MenuItem menuIndiv;
@FXML
private MenuItem menuLote;
private EstadosFinales estadosFinales;
/**
* Menu opción cargar transiciones
*
@@ -61,7 +57,6 @@ public class MenuController {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Abrir archivo XML");
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Archivos XML (*.xml)", "*.xml"));
//fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Archivos XML (*.xml)", "*.xml"));
File archivo = fileChooser.showOpenDialog(parentStage);
LeerXML xml = new LeerXML();
Document documento = xml.leerArchivo(archivo);
@@ -77,12 +72,13 @@ public class MenuController {
Text text = new Text(0, 0, "TRANSICIONES CARGADAS");
text.setFill(Color.BLACK);
text.setFont(Font.font(java.awt.Font.SANS_SERIF, 25));
text.setId("cargada");
contenido.getChildren().add(text);
menuIndiv.setDisable(false);
menuLote.setDisable(false);
}
tableView = FXMLLoader.load(getClass().getResource("/cl/cromer/mt/fxml/tabla.fxml"));
TableView<TablaData> tableView = FXMLLoader.load(getClass().getResource("/cl/cromer/mt/fxml/tabla.fxml"));
VBox.setVgrow(tableView, Priority.ALWAYS);
tableView.skinProperty().addListener((source, oldWidth, newWidth) -> {
final TableHeaderRow header = (TableHeaderRow) tableView.lookup("TableHeaderRow");
@@ -128,22 +124,48 @@ public class MenuController {
stage.show();
}
else {
TableView tableView = (TableView) scene.lookup("#tableView");
VBox contenido = (VBox) scene.lookup("#contenido");
if (tableView != null) {
tableView.setItems(null);
Text cargada = (Text) scene.lookup("#cargada");
contenido.getChildren().removeAll(tableView, cargada);
}
menuIndiv.setDisable(true);
menuLote.setDisable(true);
if(archivo != null) MT.mostrarMensaje("Error","El archivo "+ archivo.getName()+ " no es un xml valido");
else MT.mostrarMensaje("Aviso","No se ha seleccionado archivo");
if (archivo != null) {
MT.mostrarMensaje("Error", "El archivo " + archivo.getName() + " no es un xml valido");
}
else {
MT.mostrarMensaje("Aviso", "No se ha seleccionado archivo!");
}
}
}
/**
* Menu opción reconocimiento individual
*
* @throws Exception La excepción
*/
@FXML
protected void reconoceIndividual() {
@SuppressWarnings("unchecked")
protected void reconoceIndividual() throws Exception {
Scene parentScene = menuBar.getScene();
Stage parentStage = (Stage) parentScene.getWindow();
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/cl/cromer/mt/fxml/individual.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 640, 480);
scene.setUserData(estadosFinales);
scene.getStylesheets().add("/cl/cromer/mt/css/mt.css");
Stage stage = new Stage();
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(parentStage);
stage.setTitle("Reconocimiento individual");
stage.setMinHeight(480);
stage.setMinWidth(640);
stage.setScene(scene);
stage.getIcons().add(new Image(getClass().getResourceAsStream("/cl/cromer/mt/images/icon.png")));
stage.show();
}
/**
@@ -165,7 +187,7 @@ public class MenuController {
Stage stage = new Stage();
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(parentStage);
stage.setTitle("Reconocimiento por lotes");
stage.setTitle("Reconocimiento por lote");
stage.setMinHeight(480);
stage.setMinWidth(640);
stage.setScene(scene);
@@ -180,11 +202,13 @@ public class MenuController {
});
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
tableView.setEditable(true);
TableColumn<TablaData, String> columna1 = (TableColumn<TablaData, String>) tableView.getColumns().get(0);
columna1.setCellFactory(TextFieldTableCell.forTableColumn());
columna1.setOnEditCommit(
columna -> columna.getTableView().getItems().get(columna.getTablePosition().getRow()).setPrimera(columna.getNewValue())
);
columna1.setOnEditCommit(event -> {
event.getTableView().getItems().get(event.getTablePosition().getRow()).setPrimera(agregarGatos(event.getNewValue()));
event.getTableView().refresh();
});
tableView.getColumns().get(0).setText("Cadena");
tableView.getColumns().get(0).setEditable(true);
@@ -194,4 +218,22 @@ public class MenuController {
VBox contenido = (VBox) scene.lookup("#contenido");
contenido.getChildren().add(tableView);
}
/**
* Agregar un gato al inicio y al final de un string si no existen
*
* @param string El string a agregar los gatos
*
* @return String con gatos
*/
private String agregarGatos(String string) {
StringBuilder temp = new StringBuilder(string);
if (string.charAt(0) != '#') {
temp.insert(0, "#");
}
if (temp.charAt(temp.length() - 1) != '#') {
temp.insert(temp.length(), "#");
}
return temp.toString();
}
}

View File

@@ -88,4 +88,4 @@ public class TablaData {
public SimpleStringProperty segundaProperty() {
return segunda;
}
}
}

View File

@@ -26,4 +26,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
</Button>
</VBox>
</ScrollPane>
</VBox>
</VBox>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2017 Christopher Cromer
Copyright (c) 2017 Carlos Faúndez
This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
-->
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<VBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.92" fx:controller="cl.cromer.mt.IndividualController">
<ScrollPane fitToHeight="true" fitToWidth="true" VBox.vgrow="ALWAYS">
<VBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" fx:id="contenido">
<VBox alignment="CENTER" VBox.vgrow="ALWAYS" spacing="5">
<HBox alignment="TOP_CENTER" fx:id="cinta"/>
<Text fx:id="estadoActual"/>
<Text fx:id="estadoPrevio"/>
<Text fx:id="simboloLeido"/>
<Text fx:id="simboloEscrito"/>
<Text fx:id="movimiento"/>
</VBox>
<HBox alignment="CENTER" spacing="10.0">
<Text>Cadena:</Text>
<TextField id="cadena" fx:id="cadena" HBox.hgrow="ALWAYS"/>
<Button fx:id="aceptar" onAction="#aceptarCadena" text="Aceptar"/>
<padding>
<Insets left="5.0" right="5.0" top="5.0" bottom="5.0"/>
</padding>
</HBox>
<HBox alignment="CENTER" spacing="10.0">
<Button fx:id="paso" disable="true" onAction="#paso" text="Correr Paso"/>
<Button onAction="#cerrar" text="Cerrar"/>
<padding>
<Insets left="5.0" right="5.0" top="5.0" bottom="5.0"/>
</padding>
</HBox>
</VBox>
</ScrollPane>
</VBox>

View File

@@ -36,4 +36,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
</HBox>
</VBox>
</ScrollPane>
</VBox>
</VBox>

View File

@@ -14,4 +14,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
<MenuItem fx:id="menuIndiv" text="Reconocimiento individual" disable="true" onAction="#reconoceIndividual"/>
<MenuItem fx:id="menuLote" text="Reconocimiento por lote" disable="true" onAction="#reconoceLote"/>
</Menu>
</MenuBar>
</MenuBar>