skoa.helpers.ConfiguracionGraficas.java Source code

Java tutorial

Introduction

Here is the source code for skoa.helpers.ConfiguracionGraficas.java

Source

/**                   
 * 
 GNU GENERAL PUBLIC LICENSE
                   Version 3, 29 June 2007
    
 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.
 */

package skoa.helpers;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Vector;
import javax.sql.DataSource;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.Timer;
import org.apache.commons.dbcp.BasicDataSource;
import skoa.bd.Consultas;
import skoa.helpers.Graficos;
import skoa.views.ElectorFicheros;

public class ConfiguracionGraficas {

    int c = 0, cant = 0, cd = 0, nd = 0, g = 0, f = 0, nd1 = 0, ng = 1, vg = 0, nbotongraf = 1, control = 0; //control, usada al "Generar grficos"
    public boolean primera = true, vacia = false;
    JPanel principal = new JPanel(), centro = new JPanel(), oeste = new JPanel(), grafica = new JPanel(), obtenidos;
    JPanel p, p2, datos, fichero, panel, opciones, opciones2, tipos2, dirs, dirs2, fechas, fechaI, fechaF, pAdd;
    JComboBox ndirs, listado;
    JButton abrir, boton1, boton2, boton3, anadir, generar, espera, bgraf1 = new JButton(), bgraf2 = new JButton(),
            bgraf3 = new JButton(), bgraf4 = new JButton();
    JCheckBox c1, c2, c3, c4, c4a, c4b, g1, g2, f1, f2, dual;
    JFrame interfaz;
    JLabel l, l3, l4;
    JComboBox lo, lr;
    Vector<String> seleccionadas = new Vector<String>();
    JTextField fi, ff, r, nfich, rfich;
    String fini, ffin, rango, fselectruta, ruta_graficos, ejeDual = "";
    Vector<String> direcciones = new Vector<String>(), consultasDuales = new Vector<String>();
    SimpleDateFormat formatoDelTextoCarpeta = new SimpleDateFormat("yyyyMMdd hhmm");
    public String ruta_jar, ruta_destino; //RECORDAR: En inicial, se reestablece este valor.
    static String NombreCarpetaActual = "";
    ThreadGroup H = new ThreadGroup("HiloH"); //Grupo de hilos que ejecutan las consultas
    DataSource dataSource; //Pool de conexiones.
    Thread h1, h2, h3, h4; //Como maximo hay 4 consultas. Usaremos los hilos dependiendo del n de consultas.
    int nh = 1; //Contador de hilos para saber por cual vamos.
    ElectorFicheros e;
    JProgressBar progressBar;
    Timer timer;
    String user = "root", pass = "lunes20.", url = "jdbc:mysql://localhost/Skoa_Bd";
    //String user="root", pass="estefania",url="jdbc:mysql://localhost/Skoa_Bd";
    String ruta_lista, ruta_lista2;
    Timer barra;
    Graficos graf;

    public ConfiguracionGraficas(JFrame i) {
        //Inicializamos los directorios correspondientes a partir de donde se encuentra el .jar
        File dir_inicial = new File("./");
        ruta_jar = System.getProperty("user.dir");
        String os = System.getProperty("os.name");
        //En Windows las barras son \ y en Linux /.
        String busca, reemp;
        //if (os.indexOf("Win")>=0) {
        ruta_destino = ruta_jar + File.separator + "Consultas" + File.separator;
        ruta_lista2 = ruta_jar + File.separator + "lista.txt";
        //busca="\\";
        //reemp="\\\\";
        //}
        //else{
        //ruta_destino=ruta_jar+File.separator+"Consultas"+File.separator;
        //ruta_lista2=ruta_jar+File.separator+"lista.txt";
        //busca="/";
        //reemp="//";  //La doble barra es por MySQL, en Linux no s si hace falta.
        //}
        //String aux=ruta_jar,aux2="";
        //Cuando se usa una ruta en la base de datos, debe tener doble barra, es decir \\\\
        /*while(aux.length()!=0){
        if (aux.indexOf(busca)>=0) {
            aux2=aux2+aux.substring(0,aux.indexOf(busca));
            aux=aux.substring(aux.indexOf(busca)+1);
        }
        else {
            aux2=aux2+aux.substring(0);
            aux="";
        }
        aux2=aux2+reemp;
        }*/
        ruta_lista = ruta_lista2;
        //if (os.indexOf("Win")>=0) ruta_lista=aux2+"\\\\lista.txt";
        //else ruta_lista=aux2+"//lista.txt";

        //-----------------------------------
        interfaz = i;
        String g1 = " 1 "; //titulo del boton por defecto
        String g4 = " 4 ";
        Object[] options = { g1, g4 }; //titulo de los botones
        int n = JOptionPane.showOptionDialog(interfaz, "Cantas grficas desea visualizar?", "Visualizacin",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, g1);
        if (n == JOptionPane.YES_OPTION)
            g = 1;
        else if (n == JOptionPane.NO_OPTION)
            g = 4;
        vg = g;//N de graficas a visualizar. Variable usada en el procedimiento colocarGraficos()
        inicializarPaneles();
        inicial();
        iniciarConexiones2();
    }

    //Procedimiento usado cuando se pulsa de nuevo sobre la opcion <Nuevo>
    public void eliminar() {
        interfaz.remove(centro);
        interfaz.remove(oeste);
    }

    private void inicializarPaneles() {
        espera = new JButton();
        inicializaDataSource(); //Inicializa el pool de conexiones.      
        nfich = new JTextField();
        nfich.setEditable(false);
        rfich = new JTextField();
        fichero = new JPanel(); //Volvemos a crear y a configurar "panel" para no tener problemas al cambiar de vista.
        fichero.setLayout(new GridLayout(1, 3));
        e = new ElectorFicheros();
        abrir = e.openButton;
        abrir.setEnabled(false); //Al principio, se desactiva, hasta que no se elija un tipo de consulta.
        boton3 = new JButton("Seleccionar"); //Boton3 de seleccion de un fichero escogido.
        boton3.setFont(new Font("Tahoma", Font.PLAIN, 12));
        boton3.setEnabled(false);
        fichero.add(abrir);
        fichero.add(nfich);
        fichero.add(boton3);
        //Paneles principales:
        principal.setLayout(new BorderLayout());
        principal.add(new JPanel(), "West"); //aadido para que se vea este panel centrado
        principal.add(new JPanel(), "East"); //y no pegado a los bordes de la ventana
        principal.add(new JPanel(), "North"); //...
        principal.add(new JPanel(), "South"); //...      
        centro.setLayout(new BorderLayout());
        oeste.setLayout(new BorderLayout());
        //Panel centro
        grafica.setBackground(Color.lightGray);
        JPanel p = new JPanel();
        p.setBorder(BorderFactory.createEtchedBorder());
        if (g == 1) {
            grafica.setLayout(new GridLayout(1, 1));//1 grafica
            grafica.add(p);
        } else {
            grafica.setLayout(new GridLayout(2, 2));//4 graficas
            grafica.add(p);
            for (int i = 0; i < 3; i++) {
                p = new JPanel();
                p.setBorder(BorderFactory.createEtchedBorder());
                grafica.add(p);
            }
        }
        centro.add(new JPanel(), "West"); //aadido para que se vea este panel centrado
        centro.add(new JPanel(), "East"); //y no pegado a los bordes de la ventana
        centro.add(new JPanel(), "North"); //...
        centro.add(new JPanel(), "South"); //...
        centro.add(grafica, "Center");
        //Panel de datos:
        datos = new JPanel();
        datos.setLayout(new GridLayout(2, 1));
        //Panel de obtencion de datos
        panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        //Panel obtenidos (datos obtenidos)
        obtenidos = new JPanel();
        //obtenidos.setLayout(new GridLayout(5,1));
        obtenidos.setLayout(new GridLayout(6, 1));
        obtenidos.setBorder(BorderFactory.createEtchedBorder());
        //Panel dirs: num de DGs y DGs
        dirs = new JPanel();
        l3 = new JLabel("  Nmero de DGs: ");
        l3.setFont(new Font("Tahoma", Font.PLAIN, 12));
        String n[] = { "0", "1", "2", "3", "4", "5" };
        ndirs = new JComboBox(n);
        ndirs.setEditable(false);
        ndirs.setSelectedIndex(0);
        boton2 = new JButton("Seleccionar");
        boton2.setFont(new Font("Tahoma", Font.PLAIN, 12));
        dirs.setLayout(new GridLayout(1, 3));
        dirs.add(l3);
        dirs.add(ndirs); //n direcciones de grupo
        dirs.add(boton2);
        l4 = new JLabel("  Dir. de grupo:");
        l4.setFont(new Font("Tahoma", Font.PLAIN, 12));
        boton1 = new JButton("Seleccionar");
        boton1.setFont(new Font("Tahoma", Font.PLAIN, 12));
        listarDGs();
        dirs2 = new JPanel();
        dirs2.setLayout(new GridLayout(1, 3));
        dirs2.add(l4);
        dirs2.add(listado); //lista de direcciones de grupo
        dirs2.add(boton1);
        //Panel2: DGs seleccionadas y tipos de consulta
        c1 = new JCheckBox("Evolucin temporal"); //Consulta A.
        c1.setFont(new Font("Tahoma", Font.PLAIN, 12));
        c1.setSelected(false);
        c2 = new JCheckBox("Acumulacin por intervalos temporales"); //Consulta B.
        c2.setFont(new Font("Tahoma", Font.PLAIN, 12));
        c2.setSelected(false);
        c3 = new JCheckBox("Mx-Mn-Med por intervalos temporales"); //Consulta C.
        c3.setFont(new Font("Tahoma", Font.PLAIN, 12));
        c3.setSelected(false);
        c4 = new JCheckBox("Evolucin de diferencias"); //Consulta D.
        c4.setFont(new Font("Tahoma", Font.PLAIN, 12));
        c4.setSelected(false);
        tipos2 = new JPanel();
        tipos2.setLayout(new GridLayout(1, 4));
        tipos2.add(new JPanel());
        c4a = new JCheckBox("%"); //Consulta D -> %.
        c4a.setSelected(false);
        c4b = new JCheckBox("Diferencia"); //Consulta D -> Diferencia.
        c4b.setFont(new Font("Dialog", Font.PLAIN, 12));
        c4b.setSelected(false);
        tipos2.add(c4a);
        tipos2.add(c4b);
        tipos2.add(new JPanel());
        //CheckBox para ver si se muestra la grfica con doble eje
        dual = new JCheckBox("Dual");
        dual.setSelected(false);
        dual.setFont(new Font("Dialog", Font.ITALIC, 12));
        JPanel dualA = new JPanel();
        dualA.setLayout(new GridLayout(1, 3));
        JLabel aux = new JLabel("Opcin de visualizacin: ");
        aux.setFont(new Font("Dialog", Font.ITALIC, 12));
        dualA.add(aux);
        dualA.add(dual);
        dualA.add(new JPanel());
        //Panel opciones: tipos de consulta y seleccion de DGs.
        opciones = new JPanel();
        opciones.setLayout(new GridLayout(8, 1));
        opciones.add(dualA);
        opciones.add(c1);
        opciones.add(c2);
        opciones.add(c3);
        opciones.add(c4);
        opciones.add(new JPanel()); //Lugar en que van las subopciones de la consulta D
        opciones.add(dirs);
        opciones.add(dirs2);
        //Panel opciones2: DGs seleccionadas, tipo de fecha, fechas, aadir datos.
        opciones2 = new JPanel();
        opciones2.setLayout(new GridLayout(7, 1));
        opciones2.add(fichero); //Lugar en que va la seleccion de los resultados de una consulta ya hecha.
        //Panel3: en principio solo elegir fechas. Se inicializa fecha inicial
        fechas = new JPanel(); //Fecha inicial y final o todo
        fechas.setLayout(new GridLayout(1, 3));
        JLabel l2 = new JLabel("  Fechas: ");
        l2.setFont(new Font("Tahoma", Font.BOLD, 12));
        f1 = new JCheckBox("Intervalo");
        f1.setFont(new Font("Tahoma", Font.PLAIN, 12));
        f1.setSelected(false);
        f2 = new JCheckBox("Completo");
        f2.setFont(new Font("Tahoma", Font.PLAIN, 12));
        f2.setSelected(false);
        fechas.add(l2);
        fechas.add(f1);
        fechas.add(f2);
        fechaI = new JPanel();
        JLabel l5 = new JLabel("Fecha inicial:");
        l5.setFont(new Font("Tahoma", Font.PLAIN, 12));
        fi = new JTextField(16);
        JLabel laux = new JLabel("<aaaa-mm-dd>         ");
        laux.setFont(new Font("Tahoma", Font.ITALIC, 10));
        fechaI.add(l5);
        fechaI.add(fi);
        fechaI.add(laux);
        //Panel4: fecha final y [rango | nada]
        fechaF = new JPanel();
        JLabel l6 = new JLabel("Fecha final:  ");
        l6.setFont(new Font("Tahoma", Font.PLAIN, 12));
        ff = new JTextField(16);
        laux = new JLabel("<aaaa-mm-dd hh:mm>");
        laux.setFont(new Font("Tahoma", Font.ITALIC, 10));
        fechaF.add(l6);
        fechaF.add(ff);
        fechaF.add(laux);
        //Panel 5: boton de aadir
        pAdd = new JPanel();
        pAdd.setLayout(new GridLayout(1, 4));
        pAdd.add(new JPanel());
        pAdd.add(new JPanel());
        anadir = new JButton("AADIR DATOS");
        anadir.setFont(new Font("Tahoma", Font.BOLD, 12));
        pAdd.add(anadir);
        //Panel obtenidos (datos obtenidos)
        r = new JTextField(16);
        //Otras inicializaciones:
        generar = new JButton("GENERAR GR?FICAS");
        generar.setFont(new Font("Tahoma", Font.BOLD, 12));
    }

    private void reestablecerPaneles() {
        datos.removeAll();
        panel.removeAll(); //Borra todo lo del panel para inicializarlo de nuevo
        panel = new JPanel(); //NECESARIO CREARLO DE NUEVO.SINO, LA VISTA SE VE MAL Y NO CAMBIA HASTA CAMBIAR EL TAMAO DE LA VENTANA 
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        //Seleccion de ficheros
        nfich = new JTextField();
        nfich.setEditable(false);
        rfich = new JTextField();
        fichero.removeAll();
        e = new ElectorFicheros();
        abrir = e.openButton;
        abrir.setEnabled(false); //Al principio, se desactiva, hasta que no se elija un tipo de consulta.
        boton3.setEnabled(false);
        fichero.add(abrir);
        fichero.add(nfich);
        fichero.add(boton3);
        //Panel opciones: tipos de consulta y seleccion de DGs.
        dual.setSelected(false);//CheckBox para ver si se muestra la grafica con doble eje
        JPanel dualA = new JPanel();
        dualA.setLayout(new GridLayout(1, 3));
        JLabel aux = new JLabel("Opcin de visualizacin: ");
        aux.setFont(new Font("Dialog", Font.ITALIC, 12));
        dualA.add(aux);
        dualA.add(dual);
        dualA.add(new JPanel());
        opciones.removeAll();
        opciones2.removeAll();
        c1.setSelected(false);
        c2.setSelected(false);
        c3.setSelected(false);
        c4.setSelected(false);
        opciones.add(dualA);
        opciones.add(c1);
        opciones.add(c2);
        opciones.add(c3);
        opciones.add(c4);
        opciones.add(new JPanel()); //Lugar en que van las subopciones de la consulta D
        ndirs.setEditable(false);
        ndirs.setSelectedIndex(0);
        dirs.removeAll();
        dirs.add(l3);
        dirs.add(ndirs); //n direcciones de grupo
        dirs.add(boton2);
        opciones.add(dirs);
        listado.setEditable(true);
        listado.setSelectedIndex(0);
        dirs2.removeAll();
        dirs2.add(l4);
        dirs2.add(listado);
        dirs2.add(boton1);
        opciones.add(dirs2);
        opciones2.add(fichero); //Lugar en que va la seleccion de los resultados de una consulta ya hecha.
        tipos2.removeAll();
        c4a.setSelected(false);
        c4b.setSelected(false);
        tipos2.add(c4a);
        tipos2.add(c4b);
        tipos2.add(new JPanel());
        //Inicializaciones de los paneles de fechas.
        fechas.removeAll();
        JLabel l2 = new JLabel("  Fechas: ");
        l2.setFont(new Font("Tahoma", Font.BOLD, 12));
        f1.setSelected(false);
        f2.setSelected(false);
        fechas.add(l2);
        fechas.add(f1);
        fechas.add(f2);
        fechaI.removeAll();
        JLabel l5 = new JLabel("Fecha inicial:");
        l5.setFont(new Font("Tahoma", Font.PLAIN, 12));
        fi = new JTextField(16);
        JLabel laux = new JLabel("<aaaa-mm-dd>         ");
        laux.setFont(new Font("Tahoma", Font.ITALIC, 10));
        fechaI.add(l5);
        fechaI.add(fi);
        fechaI.add(laux);
        //fecha final y [rango | nada]
        fechaF.removeAll();
        JLabel l6 = new JLabel("Fecha final:  ");
        l6.setFont(new Font("Tahoma", Font.PLAIN, 12));
        ff = new JTextField(16);
        laux = new JLabel("<aaaa-mm-dd hh:mm>");
        laux.setFont(new Font("Tahoma", Font.ITALIC, 10));
        fechaF.add(l6);
        fechaF.add(ff);
        fechaF.add(laux);
        //Otras inicializaciones:
        r = new JTextField(16);
        c = cd = nd = nd1 = f = 0;
        direcciones.removeAllElements();
        direcciones = new Vector<String>();
        boton3.setEnabled(false);
        //CARGA LA VISTA REESTABLECIDA
        panel.add(opciones);
        panel.add(opciones2);
    }

    private void inicial() {
        Date fechaActual = new Date();
        NombreCarpetaActual = formatoDelTextoCarpeta.format(fechaActual);
        //Para cada consulta, se crea una carpeta con la fecha y hora de realizacion de la consulta,
        //para almacenar en ella todos los resultados y graficas de esa consulta.
        String os = System.getProperty("os.name");
        //En Windows las barras son \ y en Linux /.
        if (os.indexOf("Win") >= 0)
            ruta_destino = ruta_jar + "\\Consultas\\";
        else
            ruta_destino = ruta_jar + "/Consultas/";
        ruta_destino = ruta_destino + NombreCarpetaActual;
        File destino_consulta = new File(ruta_destino);
        destino_consulta.setExecutable(true, false);
        destino_consulta.setReadable(true, false);
        destino_consulta.setWritable(true, false);
        //HACEMOS LA CREACION DE LA CARPETA DESTINO PARA LA NUEVA CONSULTA POSTERIOR.
        if (destino_consulta.mkdir()) {
        } //System.out.println("**SE CREA DIR.   "+ruta_destino);
        else { //En caso de existir ya el directorio, porque hemos hecho las consultas muy rapido
               //y estas coinciden en su nombre, ya que el nombre es la hora en que se consulta
               //le vamos a aadir un numero indicando que es una consulta a la misma hora.
            String aux = NombreCarpetaActual.substring(NombreCarpetaActual.indexOf(" ") + 1); //Contamos desde el primer espacio
            if (aux.indexOf(" ") != -1) {
                aux = aux.substring(aux.length() - 1); //Cogemos el ultimo caracter.
                int naux = Integer.parseInt(aux); //Lo pasamos a entero
                naux++; //Lo incrementamos en 1
                NombreCarpetaActual = NombreCarpetaActual + " " + naux;
            } else
                NombreCarpetaActual = NombreCarpetaActual + " 1";
            if (os.indexOf("Win") >= 0)
                ruta_destino = ruta_jar + "\\Consultas\\";
            else
                ruta_destino = ruta_jar + "/Consultas/";
            //ruta_destino=ruta_jar+"\\Consultas\\";
            ruta_destino = ruta_destino + NombreCarpetaActual;
            destino_consulta = new File(ruta_destino);
            destino_consulta.setExecutable(true, false);
            destino_consulta.setReadable(true, false);
            destino_consulta.setWritable(true, false);
            destino_consulta.mkdir();
        }
        interfaz.getContentPane().setLayout(new BorderLayout());
        panel.add(opciones); //No se aade esta opcion en cargarVista() para generalizarla y usarla siempre.
        panel.add(opciones2); //No se aade esta opcion en cargarVista() para generalizarla y usarla siempre.
        cargarVista();
        interfaz.getContentPane().add(oeste, "West");
        interfaz.getContentPane().add(centro, "Center");
        interfaz.setVisible(true);
    }

    private void seleccionFichero() {
        fichero.removeAll();
        fichero = new JPanel(); //Volvemos a crear y a configurar "panel" para no tener problemas al cambiar de vista.
        fichero.setLayout(new GridLayout(1, 3));
        abrir.setEnabled(true);
        fichero.add(abrir);
        nfich = e.log;
        rfich = e.logruta;
        fichero.add(nfich); //Introducimos el JTextField con la seleccion realizada.
        boton3.setEnabled(true);
        fichero.add(boton3);
    }

    //Carga la vista con la configuracion realizada. La primera vez, sera la configuracion por defecto
    //proveniente de inicializarPaneles.
    private void cargarVista() {
        datos.add(panel); //CELDA DE OBTENCION DE LOS DATOS
        datos.add(obtenidos); //CELDAS DE DATOS INTRODUCIDOS (AUN VACO)
        principal.add(datos, "Center");
        oeste.add(principal);
        interfaz.setVisible(true);
    }

    //Procedimiento que realiza las mismas inicializaciones para todas las vistas iniciales.
    private void comun() {
        ndirs.setEditable(true);
        ndirs.setSelectedIndex(0);
        boton3.setEnabled(true);
        f1.setSelected(false);
        f2.setSelected(false);
        nd1 = 0; //En caso de haber elegido ya DGs, y cambiar de consulta, reestablecemos la seleccion de DGS.
        direcciones.removeAllElements();
        datos.removeAll();
        panel.removeAll();
        panel = new JPanel(); //Volvemos a crear y a configurar "panel" para no tener problemas al cambiar de vista.
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        opciones.removeAll();
        opciones2.removeAll();
        JPanel dualA = new JPanel();
        dualA.setLayout(new GridLayout(1, 3));
        JLabel aux = new JLabel("Opcin de visualizacin: ");
        aux.setFont(new Font("Dialog", Font.ITALIC, 12));
        dualA.add(aux);
        dualA.add(dual);
        dualA.add(new JPanel());
        opciones.add(dualA);
        opciones.add(c1);
        opciones.add(c2);
        opciones.add(c3);
        opciones.add(c4);
        dirs.removeAll();
        dirs.add(l3);
        dirs2.add(l4);
        fichero = new JPanel(); //Volvemos a crear y a configurar "panel" para no tener problemas al cambiar de vista.
        fichero.setLayout(new GridLayout(1, 2));
        fichero.setBackground(Color.WHITE);
    }

    //Igual que la vistaInicial. Usada para las consultas A y B.
    private void vistaInicial2() {
        comun();
        c4a.setSelected(false);
        c4a.setSelected(false);
        opciones.add(new JPanel()); //Lugar en que van las subopciones de la consulta D
        dirs.add(ndirs); //n direcciones de grupo
        dirs.add(boton2);
        opciones.add(dirs);
        listado.setSelectedIndex(0); //Se pone sin seleccionar nada.
        dirs2.add(listado); //lista de direcciones de grupo
        dirs2.add(boton1);
        opciones.add(dirs2);
        seleccionFichero();
        opciones2.add(fichero);
        panel.add(opciones);
        panel.add(opciones2);
        ndirs.setEnabled(true); //se activan, por si es el caso de ya haber rellenado casi una consulta, y cambiar de opinion,
        boton2.setEnabled(true);
        cargarVista();
    }

    //Usada en el caso de la consulta C, en la que slo dejamos elegir 1 DG.
    private void vistaInicial3() {
        comun();
        c4a.setSelected(false);
        c4a.setSelected(false);
        opciones.add(new JPanel()); //Lugar en que van las subopciones de la consulta D
        //Cambiamos el nmero de direcciones a escoger. Como es la consulta C slo es posible elegir 1.
        ndirs.setEditable(false);
        ndirs.setSelectedIndex(1);
        ndirs.setEnabled(false);
        boton2.setEnabled(false);
        dirs.add(ndirs); //n direcciones de grupo
        dirs.add(boton2);
        //Sigue cargando en el panel opciones
        opciones.add(dirs);
        listado.setSelectedIndex(0); //Se pone sin seleccionar nada.
        dirs2.add(listado); //lista de direcciones de grupo
        dirs2.add(boton1);
        opciones.add(dirs2);
        seleccionFichero();
        opciones2.add(fichero);
        panel.add(opciones);
        panel.add(opciones2);
        cargarVista();
    }

    //Usada en el caso de la consulta D, en la que slo dejamos elegir 2 DGs.
    private void vistaInicial4() {
        comun();
        //Borramos, para poder poner los check c4a y c4b en el estado en que estn.
        tipos2.removeAll();
        tipos2.add(new JPanel());
        tipos2.add(c4a);
        tipos2.add(c4b);
        tipos2.add(new JPanel());
        opciones.add(tipos2); //Subopciones de la consulta D
        //Cambiamos el nmero de direcciones a escoger. Como es la consulta D slo es posible elegir 2.
        //Da igual si hay eje dual o no.
        ndirs.setEditable(false);
        ndirs.setSelectedIndex(2);
        ndirs.setEnabled(false);
        boton2.setEnabled(false);
        dirs.add(ndirs); //n direcciones de grupo
        dirs.add(boton2);
        //Sigue cargando en el panel opciones
        opciones.add(dirs);
        listado.setSelectedIndex(0); //Se pone sin seleccionar nada.
        dirs2.add(listado); //lista de direcciones de grupo
        dirs2.add(boton1);
        opciones.add(dirs2);
        seleccionFichero();
        opciones2.add(fichero);
        panel.add(opciones);
        panel.add(opciones2);
        cargarVista();
    }

    //Se van introduciendo todas las DGs.
    private void vistaIntermedia1() {
        datos.removeAll();
        panel.removeAll();
        panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        panel.add(opciones);
        opciones2.removeAll();
        opciones2.add(fichero);
        //seleccionadas="";
        String DG = "";
        seleccionadas.removeAllElements();
        seleccionadas.add("Desplegar para ver");
        for (int i = 0; i < direcciones.size(); i++) {
            if (direcciones.elementAt(i).charAt(0) == 'C') { //Es un fichero
                //La ruta es: ruta_del_ejecutable\Consultas\...
                //TENGO QUE LLEGAR consultas y despues buscar el fichero Y PONER LO QUE SIGUE EN SELECCIONADAS.
                String aux = direcciones.elementAt(i).substring(direcciones.elementAt(i).indexOf("Consultas") + 1);
                if (aux.indexOf("A") > 0)
                    aux = aux.substring(aux.indexOf("A"));
                if (aux.indexOf("B") > 0)
                    aux = aux.substring(aux.indexOf("B"));
                if (aux.indexOf("C") > 0)
                    aux = aux.substring(aux.indexOf("C"));
                if (aux.indexOf("D") > 0)
                    aux = aux.substring(aux.indexOf("D"));
                aux = aux.substring(0, aux.indexOf(".txt"));//quito el .txt al nombre
                //if (i==0)seleccionadas=seleccionadas+aux;
                //else seleccionadas = seleccionadas + ", " + aux;
                DG = aux;
            } else {//Es una DG
                    //if (i==0) seleccionadas = seleccionadas + direcciones.elementAt(i);
                    //else seleccionadas = seleccionadas + ", " + direcciones.elementAt(i);
                DG = direcciones.elementAt(i);
            }
            seleccionadas.add(DG);
            //if(nd1==0) lo.append("Seleccionadas "+"("+(nd1+1)+" de "+nd+")"+": "+DG);
            //else lo.append("\n                                             "+DG);
        }
        p = new JPanel();
        p.setLayout(new GridLayout(1, 3));
        lo = new JComboBox(seleccionadas);
        lo.setEditable(false);
        lo.setSelectedIndex(0);
        lo.setFont(new Font("Tahoma", Font.ITALIC, 12));
        //l=new JLabel("Seleccionadas "+"("+(nd1+1)+" de "+nd+")"+": "+seleccionadas);
        l = new JLabel("Seleccionadas " + "(" + (nd1 + 1) + " de " + nd + ")" + ": ");
        l.setFont(new Font("Tahoma", Font.ITALIC, 12));
        p.add(l);
        p.add(lo);
        p.add(new JPanel());
        //lo = new javax.swing.JTextArea(1,1);
        //jScrollPane = new javax.swing.JScrollPane(lo);
        //jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        //jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        //lo.append("Seleccionadas "+"("+(nd1+1)+" de "+nd+")"+": "+seleccionadas);
        //lo.setFont(new Font("Tahoma", Font.ITALIC, 12));
        //opciones2.add(l);
        opciones2.add(p);
        //opciones2.add(jScrollPane);
        panel.add(opciones2);
        ndirs.setEnabled(false); //Una vez elegida al menos 1 DG, desactivamos la posibilidad de poder
        boton2.setEnabled(false); //cambiar el nmero de DGs a seleccionar.
        cargarVista();
    }

    //Ya se han introducido todas las direcciones. Por lo que se elige el tipo de fecha.
    private void vistaIntermedia2() {
        datos.removeAll();
        panel.removeAll();
        panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        panel.add(opciones);
        opciones2.removeAll();
        opciones2.add(fichero);
        //opciones2.add(l);
        opciones2.add(p);
        opciones2.add(fechas);
        panel.add(opciones2);
        cargarVista();
    }

    private void vistaIntermedia3() {
        panel.removeAll();
        panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        panel.setBorder(BorderFactory.createEtchedBorder());
        panel.add(opciones);
        opciones2.removeAll();
        opciones2.add(fichero);
        //opciones2.add(l);
        opciones2.add(p);
        opciones2.add(fechas);
        if (c == 1) { //Consulta A 
            if (f == 1) { //  Intervalo
                opciones2.add(fechaI);
                opciones2.add(fechaF); // fecha final
            } else { //   Completa -->panel4 vacio
                opciones2.add(new JPanel());
                opciones2.add(new JPanel());
            }
            opciones2.add(new JPanel());
        } else if (c > 4) {//Consulta D, Mayor que 4 por 5 y 6, son las subopciones % y Diferencia de 4.
            if (f == 1) { //  Intervalo
                opciones2.add(fechaI);
                opciones2.add(fechaF); // fecha final
            } else { //   Completa -->panel4 vacio
                opciones2.add(new JPanel());
                opciones2.add(new JPanel());
            }
            JPanel paux = new JPanel();
            JLabel l = new JLabel("Rango:        ");
            l.setFont(new Font("Tahoma", Font.PLAIN, 12));
            paux.add(l);
            paux.add(r);
            l = new JLabel("               en minutos     ");
            l.setFont(new Font("Tahoma", Font.ITALIC, 10));
            paux.add(l);
            opciones2.add(paux);
        } else { //Consulta B o C.
            JPanel paux = new JPanel();
            JLabel l = new JLabel("Rango:        ");
            l.setFont(new Font("Tahoma", Font.PLAIN, 12));
            paux.add(l);
            paux.add(r);
            l = new JLabel("                 en horas     ");
            l.setFont(new Font("Tahoma", Font.ITALIC, 10));
            paux.add(l);
            if (f == 1) { //Consulta B, intervalo
                opciones2.add(fechaI);
                opciones2.add(fechaF); // fecha final
                opciones2.add(paux);
            } else { //Consulta B, completo
                opciones2.add(new JPanel());
                opciones2.add(new JPanel());
                opciones2.add(paux);
            }
        }
        opciones2.add(pAdd); //Boton de aadir
        panel.add(opciones2);
        datos.removeAll();
        cargarVista();
    }

    private void vistaIntermedia4() {
        vacia = true; //Una vez llegado aqu, ya se empieza a llenar la carpeta destino.
        for (int i = 0; i < datos.getComponentCount(); i++)
            datos.remove(i); //Borra 
        datos.removeAll();
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(3, 1));
        //JLabel l=new JLabel(" Grfica "+ng+":  "+"Direcciones: "+seleccionadas);
        //l.setFont(new Font("Tahoma",Font.BOLD,12));
        p2 = new JPanel();
        p2.setLayout(new GridLayout(1, 3));
        l = new JLabel(" Grfica " + ng + ":  " + "Direcciones: ");
        l.setFont(new Font("Tahoma", Font.BOLD, 12));
        p2.add(l);
        Vector<String> AuxSeleccionadas = new Vector<String>();
        AuxSeleccionadas.addAll(seleccionadas);
        JComboBox laux = new JComboBox(AuxSeleccionadas);
        laux.setEditable(false);
        laux.setSelectedIndex(0);
        laux.setFont(new Font("Tahoma", Font.ITALIC, 12));
        //p2.add(lo);
        p2.add(laux);//para que se mantengan las anteriores al aadir nuevas.
        p2.add(new JPanel());
        ng++;
        //p.add(l);
        p.add(p2);
        String l2 = "                  ";
        if (c == 1) {
            if (ejeDual.contentEquals("dual"))
                l2 = l2 + "Consulta: Evolucin temporal dual, ";
            else
                l2 = l2 + "Consulta: Evolucin temporal, ";
        } else if (c == 2) {
            if (ejeDual.contentEquals("dual"))
                l2 = l2 + "Consulta: Acumulacin por intervalos temporales dual, ";
            else
                l2 = l2 + "Consulta: Acumulacin por intervalos temporales, ";
        } else if (c == 3)
            l2 = l2 + "Consulta: Mx-Mn-Med por intervalos temporales, ";
        else if (c == 5)
            l2 = l2 + "Consulta: Evolucin de diferencias en %, ";
        else if (c == 6)
            l2 = l2 + "Consulta: Evolucin de diferencias, ";
        if (f == 1)
            l2 = l2 + "de un intervalo.";
        else if (f == 2)
            l2 = l2 + "completa.";
        l = new JLabel(l2);
        l.setFont(new Font("Tahoma", Font.PLAIN, 12));
        p.add(l);
        l2 = "                  ";
        if (f == 1) {
            l2 = l2 + "Desde " + fini + " hasta " + ffin;
            if (c == 2 || c == 3)
                l2 = l2 + " con rango de " + rango + " horas.";
            if (c > 4)
                l2 = l2 + " con rango de " + rango + " minutos.";
        }
        if (f == 2) {
            if (c == 2 || c == 3)
                l2 = l2 + "Con rango de " + rango + " horas.";
            if (c > 4)
                l2 = l2 + "Con rango de " + rango + " minutos.";
        }
        l = new JLabel(l2);
        l.setFont(new Font("Tahoma", Font.PLAIN, 12));
        p.add(l);
        mantenerVista(p);
        //EN ESTE PUNTO DEL CDIGO, ANTES DE RESTABLECERVALORES, INVOCAR A LAS CONSULTAS (al constructor)
        //PARA GENERAR LA CONSULTA CORRESPONDIENTE ANTES DE OBTENER LOS PARMETROS DE LA SIGUIENTE CONSULTA.
        //nh indica el hilo que se tiene que coger para la consulta actual.
        try {
            if (nh == 1) { //Los hilos en su constructor llaman start.
                h1 = new Consultas(H, c, f, fini, ffin, rango, direcciones, NombreCarpetaActual, dataSource);
                h1.start();
            } else if (nh == 2) {
                h2 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
                h2.start();
            } else if (nh == 3) {
                h3 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
                h3.start();
            } else if (nh == 4) {
                h4 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
                h4.start();
            }
            nh++;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        consultasDuales.add(ejeDual);
        JPanel gen = new JPanel();
        gen.setLayout(new GridLayout(2, 1));
        gen.add(new JPanel());
        gen.add(generar);
        obtenidos.add(gen);
        reestablecerPaneles();
        cargarVista();
    }

    //INICIALIZARDOR PARA EL POOL DE CONEXIONES. SOLO SE HACE EN EL inicializaPaneles XQ CON 1 VEZ VALE.
    private void inicializaDataSource() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        basicDataSource.setUsername(user);
        basicDataSource.setPassword(pass);
        basicDataSource.setUrl(url);
        basicDataSource.setMaxActive(4);
        // Opcional. Sentencia SQL que sirve a BasicDataSource para comprobar que la conexion es correcta.
        basicDataSource.setValidationQuery("select 1");
        dataSource = basicDataSource;
    }

    /**
     * Aade paneles vacos para mantener la misma vista en todas las vistas, y poder generar cuando queramos.
     * @param p ,panel nuevo a aadir.
     */
    private void mantenerVista(JPanel p) {
        if (g == 1) {
            JPanel aux1 = (JPanel) obtenidos.getComponent(0);
            JPanel aux2 = (JPanel) obtenidos.getComponent(1);
            obtenidos.removeAll();
            obtenidos.add(aux1);
            obtenidos.add(aux2);
            obtenidos.add(p);
            obtenidos.add(new JPanel());
        } else if (g == 2) {
            JPanel aux1 = (JPanel) obtenidos.getComponent(0);
            obtenidos.removeAll();
            obtenidos.add(aux1);
            obtenidos.add(p);
            obtenidos.add(new JPanel());
            obtenidos.add(new JPanel());
        } else if (g == 3) {
            obtenidos.add(p);
            obtenidos.add(new JPanel());
            obtenidos.add(new JPanel());
            obtenidos.add(new JPanel());
        } else if (g == 0 && nh == 1) {
            obtenidos.add(p);
            obtenidos.add(new JPanel());
            obtenidos.add(new JPanel());
            obtenidos.add(new JPanel());
        } else if (g == 0 && nh != 1) {
            JPanel aux1 = (JPanel) obtenidos.getComponent(0);
            JPanel aux2 = (JPanel) obtenidos.getComponent(1);
            JPanel aux3 = (JPanel) obtenidos.getComponent(2);
            obtenidos.removeAll();
            obtenidos.add(aux1);
            obtenidos.add(aux2);
            obtenidos.add(aux3);
            obtenidos.add(p);
        }
    }

    //SE CREA UNA BARRA DE PROGRESO INDEFINIDA
    private void insertarBarraProgreso() {
        progressBar = new JProgressBar();//Barra de progresin indefinida.
        progressBar.setIndeterminate(true);
        progressBar.setVisible(true);
        progressBar.setString("Procesando...");
        progressBar.setStringPainted(true);
        obtenidos.add(progressBar);
        datos.removeAll();
        ruta_graficos = ruta_jar + "\\Consultas\\" + NombreCarpetaActual;
        graf = new Graficos(ruta_graficos, consultasDuales);
        graf.start();
        barra = new Timer(100, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cargarVista();
            }
        });
        barra.start();
        //cargarVista();
    }

    private void vistaGraficos() {
        //GENERA LOS GRFICOS UNA VEZ TENEMOS TODOS LOS DATOS
        ruta_graficos = ruta_jar + "\\Consultas\\" + NombreCarpetaActual;
        //COLOCA LOS GRAFICOS RESULTANTES EN SUS PANELES.
        grafica.removeAll();
        centro.remove(grafica);
        //CUIDADO!!! SOLO FUNCIONA CON IMAGENES CON EXTENSIN JPG. SIEMPRE AADIRLE ESTA EXTENSIN.
        String nombreImagen = "";
        File dir = new File(ruta_graficos);
        String[] ficheros = dir.list();
        String ruta_aux;
        for (int i = 0; i < ficheros.length; i++) {
            ruta_aux = ruta_graficos + "\\" + ficheros[i] + "\\";
            File dir2 = new File(ruta_graficos + "\\" + ficheros[i]);
            String[] ficheros2 = dir2.list();
            //Segn la ventana, si se visualiza 1 grafica o 4, busco el grfico ms adecuado.
            for (int j = 0; j < ficheros2.length; j++) {
                if (ficheros2[j].indexOf("Small") > 0) {
                    nombreImagen = ruta_aux + ficheros2[j];
                    break;
                }
            }
            JPanel p = new JPanel();
            p.setLayout(new BorderLayout()); //Para que el boton ocupe todo el panel.
            p.setBorder(BorderFactory.createEtchedBorder());
            ImageIcon icon = new ImageIcon(nombreImagen);
            if (nbotongraf == 1) {
                bgraf1.setIcon(icon);
                bgraf1.setBackground(Color.lightGray);
                p.add(bgraf1);
            }
            if (nbotongraf == 2) {
                bgraf2.setIcon(icon);
                bgraf2.setBackground(Color.lightGray);
                p.add(bgraf2);
            }
            if (nbotongraf == 3) {
                bgraf3.setIcon(icon);
                bgraf3.setBackground(Color.lightGray);
                p.add(bgraf3);
            }
            if (nbotongraf == 4) {
                bgraf4.setIcon(icon);
                bgraf4.setBackground(Color.lightGray);
                p.add(bgraf4);
            }
            nbotongraf++;
            grafica.add(p);
        }

        centro.add(grafica, "Center");
        interfaz.getContentPane().add(centro);
        interfaz.setVisible(true);
        progressBar.setVisible(false);
        barra.stop();
    }

    private void listarDGs() {
        File archivo = new File(ruta_lista2); //lista de Dgs.
        if (archivo.exists()) {
            //Si el archivo ya existe, se borra para pedir a la BD la lista actual.
            archivo.delete();
        } else {
            try {
                archivo.createNewFile();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        //En vez de sacarla de un archivo, se debera sacar de la base de datos.
        Connection con;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(url, user, pass);
            Statement st = con.createStatement();
            String accion = "select DG,DF into outfile '" + ruta_lista + "' from Dirs;";
            System.out.println(accion);

            st.executeQuery(accion);
            st.close();
            con.close();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
            //Warning en caso de que la BD no existiera.
            JOptionPane.showMessageDialog(new JFrame("AVISO"), "No existe la base de datos.", "AVISO", 2);
        }
        //Volvemos a abrir el fichero porque se ha creado nuevo.
        archivo = new File(ruta_lista2); //lista de Dgs.
        FileReader fr = null;
        BufferedReader linea = null;
        String line;
        try {
            fr = new FileReader(archivo);
            linea = new BufferedReader(fr);
            Vector<String> lista = new Vector<String>();
            lista.add("");
            while ((line = linea.readLine()) != null)
                lista.add(line); //Ordenar las DGs alfabeticamente
            Collections.sort(lista); //...
            //Como estn las DGs con sus correspondientes DFs, se ven juntas. Aadimos un espacio.
            Vector<String> lista2 = new Vector<String>();
            lista2.add(""); //Cabecera de la lista desplegable
            String aux = "";
            for (int i = 1; i < lista.size(); i++) {//empieza desde 1, porque en la posicion 0 esta "".
                aux = lista.elementAt(i).substring(0, 6) + "  " + lista.elementAt(i).substring(6);
                aux = aux.replaceAll("-", "/");
                lista2.add(aux);
            }
            //---------------------------
            listado = new JComboBox(lista2);
            listado.setEditable(true);
            listado.setSelectedIndex(0);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr)
                    fr.close(); //Se cierra si todo va bien.
            } catch (Exception e2) { //Sino salta una excepcion.
                e2.printStackTrace();
            }
        }
        archivo.delete();
    }

    //El n pasado por parmetro, nos indicar la carpeta en donde buscar, dependiendo del n de consultas
    //realizadas a la vez (1  4). 0=1, 1=2, 2=3 y 3=4 carpeta, respectivamente.
    private void verGraficaEnGrande(int i) {
        File dir = new File(ruta_graficos);
        String[] ficheros = dir.list();
        String ruta_aux = ruta_graficos + "\\" + ficheros[i] + "\\";
        String nombreImagen = ruta_aux + "EvolucionBig.jpg";
        File aux = new File(nombreImagen); //Creamos un fichero auxiliar con el nombre anterior.
        if (!aux.exists()) { //Comprobamos si existe. Sino existe, era una consulta B.
            nombreImagen = ruta_aux + "BarrasBig.jpg"; //Y cambiamos el nombre.
            aux = new File(nombreImagen);
            if (!aux.exists()) {
                nombreImagen = ruta_aux + "MaxMinMedBig.jpg"; //Y cambiamos el nombre.
                aux = new File(nombreImagen);
                if (!aux.exists())
                    nombreImagen = ruta_aux + "DiferenciasBig.jpg"; //Cambia al ultimo nombre posible.
            }
        }
        ImageIcon icon = new ImageIcon(nombreImagen);
        //JOptionPane.showMessageDialog(interfaz, icon, "Statistics", JOptionPane.CLOSED_OPTION);
        JOptionPane.showMessageDialog(interfaz, icon, "Estadsticas", JOptionPane.DEFAULT_OPTION);
        /*String string1 = "Acept"; //PARA INGLS
        Object[] options = {string1};
        JOptionPane.showOptionDialog(interfaz,
              "",
                                 "Statistics",   //titulo de la ventana
                                 JOptionPane.YES_OPTION,
                                 JOptionPane.DEFAULT_OPTION,
                                 icon,       //use a custom Icon
                                 options,    //the titles of buttons
                                 string1);    //the title of the default button
             */
    }

    /**************************
     * MANEJADORES DE EVENTOS *
     **************************/
    class CheckBoxListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            Object source = e.getItemSelectable();
            int estado = e.getStateChange();
            if (source == dual & estado == 1) { //Definir para las consultas A,B y D eje dual.
                ejeDual = "dual";
                //Si es eje dual, slo pueden tener 2 DGs.
                if (c == 3)
                    nd = 1;
                else {
                    nd = 2;
                    ndirs.setSelectedIndex(2);
                    ndirs.setEditable(false);
                    ndirs.setEnabled(false);
                    boton2.setEnabled(false);
                }
            }
            if (source == dual & e.getStateChange() == ItemEvent.DESELECTED) {
                ejeDual = "";
                nd = 0; //Se deseleccion el eje dual
                if (c == 1 || c == 2) {
                    ndirs.setSelectedIndex(0);
                    ndirs.setEditable(true);
                    ndirs.setEnabled(true);
                    boton2.setEnabled(true);
                }
            }
            if (source == c1 & estado == 1) { //consulta A
                c = 1;
                vistaInicial2(); //Vuelve a la vista inicial, quita las subopciones de D
                if (c == 1) { //Desactiva los dems
                    c2.setSelected(false);
                    c3.setSelected(false);
                    c4.setSelected(false);
                    dual.setSelected(false);
                }
            }
            if (source == c2 & estado == 1) { //consulta B
                c = 2;
                vistaInicial2(); //Vuelve a la vista inicial, quita las subopciones de D
                if (c == 2) { //Desactiva los dems
                    c1.setSelected(false);
                    c3.setSelected(false);
                    c4.setSelected(false);
                    dual.setSelected(false);
                }
            }
            if (source == c3 & estado == 1) { //consulta C
                c = 3;
                nd = 1; //Inicializamos ya el nmero de DGs, x defecto
                vistaInicial3(); //Vuelve a la vista inicial, quita las subopciones de D
                if (c == 3) { //Desactiva los dems
                    c1.setSelected(false);
                    c2.setSelected(false);
                    c4.setSelected(false);
                    dual.setSelected(false);
                }
            }
            if (source == c4 & estado == 1) { //consulta D
                c = 4;
                nd = 2; //Inicializamos ya el nmero de DGs, x defecto
                vistaInicial4(); //Mostrar las 2 subopciones
                if (c == 4) { //Desactiva los dems
                    c1.setSelected(false);
                    c2.setSelected(false);
                    c3.setSelected(false);
                    dual.setSelected(false);
                }
            }
            if (source == c4a & estado == 1) { //consulta D, %
                c = 5;
                cd = 1;
                if (f == 0)
                    vistaInicial4(); //Mostrar las 2 subopciones
                else
                    vistaIntermedia3();
                if (c == 5)
                    c4b.setSelected(false); //Desactiva los dems
            }
            if (source == c4b & estado == 1) { //consulta D, Abs
                c = 6;
                cd = 2;
                if (f == 0)
                    vistaInicial4(); //Mostrar las 2 subopciones
                else
                    vistaIntermedia3();
                if (c == 6)
                    c4a.setSelected(false); //Desactiva los dems
            }
            if (source == f1 & estado == 1) { //Intervalo
                f = 1;
                f2.setSelected(false);
                if (c == 4 && cd == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Pulse algunas de las subopciones de la cuarta consulta", "Aviso",
                            JOptionPane.WARNING_MESSAGE);
                else if (c != 0)
                    vistaIntermedia3();
            }
            if (source == f2 & estado == 1) { //Completo
                f = 2;
                f1.setSelected(false);
                if (c == 4 && cd == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Pulse algunas de las subopciones de la cuarta consulta", "Aviso",
                            JOptionPane.WARNING_MESSAGE);
                else if (c != 0)
                    vistaIntermedia3();
            }
        }
    }

    class EventHandler2 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
            if (source == boton2) { //Seleccionar n de DGs
                if (control != 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha creado grficas, si desea crear ms\n pulse File->Nuevo", "Aviso",
                            JOptionPane.WARNING_MESSAGE);

                else if (g == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha seleccionado los datos de todas las grficas.\n             PULSE <<GENERAR GR?FICAS>>",
                            "Aviso", JOptionPane.WARNING_MESSAGE);
                else if (c == 0)
                    JOptionPane.showMessageDialog(interfaz, "Seleccione un tipo de consulta.", "Aviso",
                            JOptionPane.WARNING_MESSAGE);
                else {
                    String s = (String) ndirs.getSelectedItem();
                    nd = Integer.parseInt(s);
                }
            }
            if (source == boton1) { //Seleccionar DGs
                if (control != 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha creado grficas, si desea crear ms\n pulse File->Nuevo", "Aviso",
                            JOptionPane.WARNING_MESSAGE);

                else if (g == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha seleccionado los datos de todas las grficas.\n             PULSE <<GENERAR GR?FICAS>>",
                            "Aviso", JOptionPane.WARNING_MESSAGE);

                else if (nd == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Primero elija el nmero de direcciones a procesar\n   y a continuacin pulse 'Seleccionar'",
                            "Aviso", JOptionPane.WARNING_MESSAGE);
                else {
                    if (nd1 < nd) {
                        String s = (String) listado.getSelectedItem();
                        if (s == "")
                            JOptionPane.showMessageDialog(interfaz, "Seleccione alguna direccin de grupo.",
                                    "Aviso", JOptionPane.WARNING_MESSAGE);
                        else {
                            direcciones.add(s);
                            vistaIntermedia1();
                            nd1++;
                            if (nd1 == nd)
                                vistaIntermedia2();
                        }
                    } else
                        JOptionPane.showMessageDialog(interfaz, "Ya ha introducido todas las direcciones", "Aviso",
                                JOptionPane.WARNING_MESSAGE);
                }
            }
            if (source == boton3) { //Seleccionar un fichero ya elegido para tratar en la consulta.
                if (control != 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha creado grficas, si desea crear ms\n pulse File->Nuevo", "Aviso",
                            JOptionPane.WARNING_MESSAGE);

                else if (g == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha seleccionado los datos de todas las grficas.\n             PULSE <<GENERAR GR?FICAS>>",
                            "Aviso", JOptionPane.WARNING_MESSAGE);

                else if (nd == 0)
                    JOptionPane.showMessageDialog(interfaz,
                            "Primero elija el nmero de direcciones a procesar\n   y a continuacin pulse 'Seleccionar'",
                            "Aviso", JOptionPane.WARNING_MESSAGE);
                else {
                    String s = nfich.getText();
                    if (s == "")
                        JOptionPane.showMessageDialog(interfaz, "Seleccione algn fichero o direccin .", "Aviso",
                                JOptionPane.WARNING_MESSAGE);
                    else {
                        direcciones.add(rfich.getText()); //guardamos la ruta del fichero seleccionado
                        vistaIntermedia1();
                        nd1++;
                        if (nd1 == nd)
                            vistaIntermedia2();
                    }
                }
            }
            if (source == abrir) { //Boton abrir un fichero como DG
                if (c == 1 || c == 2)
                    vistaInicial2();
                else if (c == 3)
                    vistaInicial3();
                else if (c >= 4)
                    vistaInicial4();
            }
            if (source == anadir) { //Boton aadir
                if (g != 0) {
                    g--;
                    fini = fi.getText(); //Por si no se da al enter, y que se cojan
                    ffin = ff.getText();
                    rango = r.getText();
                    vistaIntermedia4();
                } else
                    JOptionPane.showMessageDialog(interfaz, "Ya ha introducido los datos \n de todas las grficas",
                            "Aviso", JOptionPane.WARNING_MESSAGE);
            }
            if (source == generar) { //Boton GENERAR
                if (control == 0) {
                    insertarBarraProgreso();
                    timer = new Timer(2000, new TimerListener()); //Cada 2seg salta el timer y comprueba.
                    timer.start();
                    control++;
                } else
                    JOptionPane.showMessageDialog(interfaz,
                            "Ya ha creado grficas, si desea crear ms\n pulse Archivo->Nuevo", "Aviso",
                            JOptionPane.WARNING_MESSAGE);
            }
            if (source == espera)
                vistaGraficos(); //BOTON ESPERA, ES INVISIBLE PARA EL USUARIO.
            if (source == bgraf1)
                verGraficaEnGrande(0); //Botn que visualiza la GRFICA1 en otra ventana
            if (source == bgraf2)
                verGraficaEnGrande(1); //Botn que visualiza la GRFICA2 en otra ventana
            if (source == bgraf3)
                verGraficaEnGrande(2); //Botn que visualiza la GRFICA3 en otra ventana
            if (source == bgraf4)
                verGraficaEnGrande(3); //Botn que visualiza la GRFICA4 en otra ventana
        }
    };

    ActionListener manejador1 = new EventHandler2();
    ItemListener manejador2 = new CheckBoxListener();

    public void iniciarConexiones2() {
        ndirs.addActionListener(manejador1);
        boton1.addActionListener(manejador1);
        boton2.addActionListener(manejador1);
        boton3.addActionListener(manejador1);
        bgraf1.addActionListener(manejador1);
        bgraf2.addActionListener(manejador1);
        bgraf3.addActionListener(manejador1);
        bgraf4.addActionListener(manejador1);
        fi.addActionListener(manejador1);
        ff.addActionListener(manejador1);
        r.addActionListener(manejador1);
        anadir.addActionListener(manejador1);
        generar.addActionListener(manejador1);
        espera.addActionListener(manejador1);
        c1.addItemListener(manejador2);
        c2.addItemListener(manejador2);
        c3.addItemListener(manejador2);
        c4.addItemListener(manejador2);
        c4a.addItemListener(manejador2);
        c4b.addItemListener(manejador2);
        dual.addItemListener(manejador2);
        f1.addItemListener(manejador2);
        f2.addItemListener(manejador2);
    }

    //Clase creada para implementar un timer que compruebe si los hilos han finalizado
    //y asi poder parar la barra de progreso y mostrar las grficas resultantes.
    public class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0) {
            if (H.activeCount() == 0 && !graf.isAlive()) {
                timer.stop();
                espera.doClick();
            }
        }
    }

}