package gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.JTableHeader;
import algoritmos.AlgoritmoAEstrella;
import algoritmos.AlgoritmoAnchura;
import algoritmos.AlgoritmoDijkstra;
import algoritmos.AlgoritmoProfundidad;
import algoritmos.AlgoritmoResolucion;
import tablero.*;
import traza.*;
/**
* Entorno gr�fico de la aplicaci�n
* @author Agust�n Medina Varo
* @version 0.1
*/
public class GUI {
/**
*
*/
private static final long serialVersionUID = 1L;
private Tablero tablero;
Font fuentePequenna = new Font("Serif", Font.ITALIC, 10);
Font fuenteMediana= new Font("Serif", Font.ITALIC, 13);
String palabraHorizontal="GATCA";
String palabraVertical="AGGT";
TrazaAlgoritmo traza;
private String[] nombreAlgoritmos={"Algorimo profundidad","Algoritmo en anchura","Dijkstra","Algoritmo A*"};
public AlgoritmoResolucion algResolucion;
/**
* Tama�o inicial de las casillas del tablero
*/
public static final int TAMANNO_CASILLA_INICIAL=35;
public int velocidad=200;
public Thread trAlgoritmo;
/**
* Constructor
* @param ventana Container principal de la aplicaci�n
*/
public GUI(Container ventana){
ventana.setLayout(new BorderLayout());
ventana.add(panelMenu(),BorderLayout.NORTH);
ventana.add(panelTablero(),BorderLayout.CENTER);
ventana.add(panelDatosMostrados(),BorderLayout.EAST);
traza=new TrazaAlgoritmo(tablero);
algResolucion=new algoritmos.AlgoritmoProfundidad(this.traza,this.palabraHorizontal,this.palabraVertical);
traza.cambiarAlgoritmo(algResolucion);
}
/**
* Construye el men� de opciones de la aplicaci�n
* @return Devuelve el Panel con todas las opciones de la aplicaci�n
*/
private JPanel panelMenu(){
JPanel panelSuperior=new JPanel();
panelSuperior.setBorder(BorderFactory.createTitledBorder("Opciones de b�squeda"));
GroupLayout layout = new GroupLayout(panelSuperior);
panelSuperior.setLayout(layout);
// A�adimos huecos automaticamente entre componentes
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//Etiquetas
JLabel labelAlgoritmo = new JLabel("Algoritmo:");
labelAlgoritmo.setFont(fuenteMediana);
JLabel labelCoste = new JLabel("Funci�n de coste:");
labelCoste.setFont(fuenteMediana);
JLabel labelHeuristica = new JLabel("Funci�n heur�stica:");
labelHeuristica.setFont(fuenteMediana);
JLabel labelTamanno = new JLabel("Tama�o del tablero");
labelTamanno.setFont(fuenteMediana);
JLabel labelVelocidad = new JLabel("Velocidad");
labelVelocidad.setFont(fuenteMediana);
JLabel labelSliderTamannoPequenno=new JLabel("0.5x");
labelSliderTamannoPequenno.setFont(fuentePequenna);
JLabel labelSliderTamannoMediano=new JLabel("1x");
labelSliderTamannoMediano.setFont(fuentePequenna);
JLabel labelSliderTamannoGrande=new JLabel("2x");
labelSliderTamannoGrande.setFont(fuentePequenna);
JLabel labelSliderVelocidadLento=new JLabel("0x");
labelSliderVelocidadLento.setFont(fuentePequenna);
JLabel labelSliderVelocidadNormal=new JLabel("1x");
labelSliderVelocidadNormal.setFont(fuentePequenna);
JLabel labelSliderVelocidadRapido=new JLabel("4x");
labelSliderVelocidadRapido.setFont(fuentePequenna);
//Combos
JComboBox comboAlgoritmo = new JComboBox(this.nombreAlgoritmos);
comboAlgoritmo.setFont(fuenteMediana);
comboAlgoritmo.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
cambiarAlgoritmo(cb.getSelectedIndex());
}
});
JComboBox comboCoste = new JComboBox();
comboCoste.setFont(fuenteMediana);
JComboBox comboHeuristica = new JComboBox();
comboHeuristica.setFont(fuenteMediana);
//Botones
JButton botonIniciar=new JButton("Iniciar");
botonIniciar.setFont(fuenteMediana);
botonIniciar.setContentAreaFilled(true);
botonIniciar.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
iniciarAlgoritmo();
}
});
JButton botonLimpiar=new JButton("Limpiar");
botonLimpiar.setFont(fuenteMediana);
botonLimpiar.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
traza.limpiarTablero();
}
});
//Sliders
JSlider sliderTamanno = new JSlider(JSlider.HORIZONTAL, 15, 55, 35);
//Creamos la tabla de etiquetas.
Hashtable<Integer, JLabel> labelTableTamanno = new Hashtable<Integer, JLabel>();
//Podr�amos usar im�genes
labelTableTamanno.put(new Integer( 15 ),labelSliderTamannoPequenno);
//new JLabel(createImageIcon("images/stop.gif")) );
labelTableTamanno.put(new Integer( 35 ),labelSliderTamannoMediano);
//new JLabel(createImageIcon("images/slow.gif")) );
labelTableTamanno.put(new Integer( 55 ),labelSliderTamannoGrande);
//new JLabel(createImageIcon("images/fast.gif")) );
//Configuramos las opciones de la tabla
sliderTamanno.setLabelTable(labelTableTamanno);
sliderTamanno.setMajorTickSpacing(10);
sliderTamanno.setMinorTickSpacing(10);
sliderTamanno.setPaintTicks(true);
sliderTamanno.setPaintLabels(true);
sliderTamanno.setSnapToTicks(true);
sliderTamanno.setPreferredSize(new Dimension(175,0));
sliderTamanno.setBorder(
BorderFactory.createEmptyBorder(0,0,10,0));
sliderTamanno.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
cambiarTamanno(source.getValue());
}
}
});
JSlider sliderVelocidad = new JSlider(JSlider.HORIZONTAL, 0, 4, 2);
//Creamos la tabla de etiquetas.
Hashtable<Integer, JLabel> labelTableVelocidad = new Hashtable<Integer, JLabel>();
//Podr�amos usar im�genes
labelTableVelocidad.put(new Integer( 0 ),labelSliderVelocidadLento);
//new JLabel(createImageIcon("images/stop.gif")) );
labelTableVelocidad.put(new Integer( 2 ),labelSliderVelocidadNormal);
//new JLabel(createImageIcon("images/slow.gif")) );
labelTableVelocidad.put(new Integer( 4 ),labelSliderVelocidadRapido);
//new JLabel(createImageIcon("images/fast.gif")) );
//Configuramos las opciones de la tabla
sliderVelocidad.setLabelTable(labelTableVelocidad);
sliderVelocidad.setMajorTickSpacing(1);
sliderVelocidad.setMinorTickSpacing(1);
sliderVelocidad.setPaintTicks(true);
sliderVelocidad.setPaintLabels(true);
sliderVelocidad.setSnapToTicks(true);
sliderVelocidad.setPreferredSize(new Dimension(175,0));
sliderVelocidad.setBorder(
BorderFactory.createEmptyBorder(0,0,10,0));
sliderVelocidad.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
try {
cambiarVelocidad((4-source.getValue())*500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//Configuramos los grupos horizontales (componentes verticales de cada grupo visto en horizontal)
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup()
.addComponent(labelAlgoritmo)
.addComponent(labelCoste)
.addComponent(labelHeuristica)
)
.addGroup(layout.createParallelGroup(Alignment.CENTER,false)
.addComponent(comboAlgoritmo)
.addComponent(comboCoste)
.addComponent(comboHeuristica)
)
.addGap(30)
.addGroup(layout.createParallelGroup(Alignment.CENTER,false)
.addComponent(labelTamanno)
.addComponent(sliderTamanno)
)
.addGap(30)
.addGroup(layout.createParallelGroup(Alignment.CENTER,false)
.addComponent(labelVelocidad)
.addComponent(sliderVelocidad)
)
.addGap(30)
.addGroup(layout.createParallelGroup(Alignment.CENTER,false)
.addComponent(botonIniciar)
.addComponent(botonLimpiar)
)
);
//Configuramos los grupos verticales (componentes horizontales de cada grupo visto en vertical)
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(labelAlgoritmo)
.addComponent(comboAlgoritmo)
.addComponent(labelTamanno)
.addComponent(labelVelocidad)
.addComponent(botonIniciar)
)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(labelCoste)
.addComponent(comboCoste)
.addComponent(sliderTamanno)
.addComponent(sliderVelocidad)
.addComponent(botonLimpiar)
)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(labelHeuristica)
.addComponent(comboHeuristica))
);
return panelSuperior;
}
/**
* Crea la zona de la representaci�n del espacio de estados del problema
* @return Devuelve el panel donde se representar� el espacio de estados
*/
private Container panelTablero(){
JPanel panelPrincipal = new JPanel(new FlowLayout(FlowLayout.LEFT));
panelPrincipal.setBorder(BorderFactory.createTitledBorder("Espacio de estados"));
panelPrincipal.setBackground(Color.white);
//Instaciamos el tablero
tablero = new Tablero(this.palabraHorizontal,this.palabraVertical,GUI.TAMANNO_CASILLA_INICIAL,true);
panelPrincipal.add(tablero,"tablero");
//Panel con scroll para poder ver todo el tablero en caso de que no quepa
//en la zona de visualizaci�n
JScrollPane panelPrincipalScroll=new JScrollPane(panelPrincipal);
panelPrincipalScroll.setMinimumSize(new Dimension(500,300));
return panelPrincipalScroll;
}
/**
* Panel donde se muestran los datos estad�sticos de ejecuci�n
* @return Devuelve el panel con las zonas donde se mostrar�n los datos de ejecuci�n del algoritmo seleccionado
*/
private JPanel panelDatosMostrados(){
//Etiquetas
JLabel etiqueta2;
JPanel panelInf2;
panelInf2 = new JPanel();
panelInf2.setLayout(new GridLayout(0,1));
panelInf2.setBorder(BorderFactory.createTitledBorder("Datos de ejecuci�n"));
panelInf2.add(this.tablaAlgoritmoActual());
// panelInf2.add(this.tablaAlgoritmoActual());
// etiqueta2 = new JLabel("N�mero: ");
// panelInf2.add(etiqueta2);
//
// etiqueta2 = new JLabel("124");
// panelInf2.add(etiqueta2);
//
// etiqueta2 = new JLabel("M�xima :");
// panelInf2.add(etiqueta2);
//
// etiqueta2 = new JLabel("1200MB");
// panelInf2.add(etiqueta2);
//
// etiqueta2 = new JLabel("Memoria :");
// panelInf2.add(etiqueta2);
//
// etiqueta2 = new JLabel("1000MB");
// panelInf2.add(etiqueta2);
panelInf2.setPreferredSize(new Dimension(400,1000));
// panelInf2.setMaximumSize(new Dimension(100,3000));
return panelInf2;
}
public Component tablaAlgoritmoActual() {
final JTable table = new JTable(new CustomTableModel());
table.setPreferredScrollableViewportSize(new Dimension(800, 70));
table.setFillsViewportHeight(true);
// table.setEnabled(false);
table.setRowSelectionAllowed(true);
// table.setCellSelectionEnabled(false);
//Implement table header tool tips.
TrazaAlgoritmo.tablaEstadisticas=table;
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
return scrollPane;
}
private void cambiarTamanno(int tamanno) {
tablero.cambiarTamanno(tamanno);
}
private void cambiarVelocidad(int velocidad) throws InterruptedException{
if (this.velocidad!=velocidad){
this.traza.cambiarVelocidad(velocidad);
}
}
private void iniciarAlgoritmo(){
// if(this.trAlgoritmo.isAlive()){
// this.trAlgoritmo=null;
// }
//algoritmos.Tiempo tr2=new algoritmos.Tiempo("auxi");
this.traza.limpiarTablero();
trAlgoritmo=new Thread(this.algResolucion);
trAlgoritmo.start();
//tr2.start();
}
@SuppressWarnings("unused")
private void limpiarTablero(){
this.tablero.limpiarTablero();
}
private void cambiarAlgoritmo(int indice){
if(indice==0){
this.algResolucion=new AlgoritmoProfundidad(this.traza,this.palabraHorizontal,this.palabraVertical);
}
else if(indice==1){
this.algResolucion=new AlgoritmoAnchura(this.traza,this.palabraHorizontal,this.palabraVertical);
}
else if(indice==2){
this.algResolucion=new AlgoritmoDijkstra(this.traza,this.palabraHorizontal,this.palabraVertical);
}
else if(indice==3){
this.algResolucion=new AlgoritmoAEstrella(this.traza,this.palabraHorizontal,this.palabraVertical);
}
this.traza.cambiarAlgoritmo(this.algResolucion);
}
}