public void listenerPrincipal(final QuickPropagationContainer qpGui){

		qpGui.btnAgregarSetAprendizaje.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	DefaultTableModel temp = (DefaultTableModel) qpGui.tablaSetAprendizaje.getModel();
				Object nuevo[]= {"0","0", "0", "0", "0", "0", "0", "0", "0", "0"};
				temp.addRow(nuevo);
		    }
		});

		qpGui.btnEliminarSetAprendizaje.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	DefaultTableModel temp = (DefaultTableModel) qpGui.tablaSetAprendizaje.getModel();
		    	if(temp.getRowCount() > 0){
		    		temp.removeRow(temp.getRowCount()-1);
		    	}
		    }
		});

		qpGui.btnAgregarSetPrueba.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	DefaultTableModel temp = (DefaultTableModel) qpGui.tablaSetPruebas.getModel();
				Object nuevo[]= {"0","0", "0", "0", "0", "0", "0", "0", "-"};
				temp.addRow(nuevo);
		    }
		});

		qpGui.btnEliminarSetPrueba.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	DefaultTableModel temp = (DefaultTableModel) qpGui.tablaSetPruebas.getModel();
		    	if(temp.getRowCount() > 0){
		    		temp.removeRow(temp.getRowCount()-1);
		    	}
		    }
		});
		
		qpGui.btnEntrenar.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				qpGui.visibleSalida(false);
				qpGui.lblNoEntrenada.setVisible(true);
				qpGui.lblNoEntrenada.setText("<html><b>Entrenando...</b></html>");
					
				//Establecer la arquitectura
				qp.setNumeroCapasOcultas(Integer.valueOf(qpGui.txtCapas.getText()));
				qp.setNumeroNeuronasPorCapa(Integer.valueOf(qpGui.txtNeuronas.getText()));

				
				//Establecer los parametros
				qp.setRazonAprendizaje(Double.valueOf(qpGui.txtRazonAprendizaje.getText()));
				qp.setLimiteEpocas(Integer.valueOf(qpGui.txtLimiteEpocasInicial.getText()));
				qp.setErrorDeseado(Double.valueOf(qpGui.txtErrorDeseado.getText()));

				//Inicializar los pesos segun las capas, neuronas, entradas
				qp.inicializarPesos();
				qp.salidasPorCapa = new String[qp.getNumeroCapasOcultas()][qp.getNumeroNeuronasPorCapa()];
				qp.sensibilidades = new double[qp.getNumeroCapasOcultas()][qp.getNumeroNeuronasPorCapa()];
				
				//Crear las matrices de gradientes de error y pesos anterior
				qp.gradienteErrorAnterior  = new double[qp.getNumeroCapasOcultas()][qp.getNumeroNeuronasPorCapa()][qp.getNumeroEntradas()+1];
				qp.incrementoPesosAnterior = new double[qp.getNumeroCapasOcultas()][qp.getNumeroNeuronasPorCapa()][qp.getNumeroEntradas()+1];
				qp.gradienteErrorAdalineAnterior  = new double [qp.getNumeroNeuronasPorCapa()+1];
				qp.incrementoPesosAdalineAnterior = new double [qp.getNumeroNeuronasPorCapa()+1];
				
				//Inicializar pesos para la neurona de salida (Adaline)
				qp.inicializarPesosAdaline();
			
				
				qp.entrenar(getData(qpGui.tablaSetAprendizaje.getModel()));
				
				
				qpGui.lblNoEntrenada.setVisible(false);
				qpGui.lblErrorFinal.setVisible(true);
				qpGui.lblErrorValor.setVisible(true);
				qpGui.lblEpocasValor.setVisible(true);
				qpGui.lblEpocasFinal.setVisible(true);
				qpGui.btnClasificar.setVisible(true);
				qpGui.btnError.setVisible(true);

				
				//Valores finales
				qpGui.lblEpocasValor.setText("<html><b>"+qp.getNumeroEpocasFinal()+"</b></html>");
				qpGui.lblErrorValor.setText("<html><b>"+qp.getErrorFinal()+"</b></html>");

				

				
			}
		});
		
		qpGui.btnClasificar.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	qpGui.ventanaClasificaciones();
		    
		    }
		});
		
		qpGui.btnError.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
				Cartesian grafica = new Cartesian();
				
				for(int i = 0; i < qp.getNumeroEpocasFinal(); i++){

					grafica.addPoint(Color.red, (float)i+1, Double.valueOf(qp.errores.get(i)));
				}
				
		    	Plot2DPanel plot = grafica.plot();
			
				plot.setAxisLabel(0, "Época");
				plot.setAxisLabel(1, "Error");
				
				qpGui.ventanaGraficaErrores(plot);
		    
		    }
		});
		
		qpGui.btnClasificarPrueba.addActionListener(new ActionListener() {          
		    public void actionPerformed(ActionEvent e) {
		    	String[][] clasificados = qp.clasificar(getData(qpGui.tablaSetPruebas.getModel()));
				DefaultTableModel resultModel =  (DefaultTableModel) qpGui.tablaSetPruebas.getModel();
				
				DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
				simbolos.setDecimalSeparator('.');
				DecimalFormat formato = new DecimalFormat("#####.##",simbolos);
				double efectividad  = 0;
				double porcentaje = 0;
				
				//Obtener las respuestas correctas
				String [] respuestas = qpGui.obtenerRespuestasCorrectas(clasificados.length);
				
				for(int j=0; j<clasificados.length; j++){
					resultModel.setValueAt(clasificados[j][8], j, 8);
					
					if(clasificados[j][8].equals(respuestas[j]))
						efectividad++;
				}
				
				porcentaje = efectividad/clasificados.length;
				qpGui.lblEfectividad.setText("Porcentaje de efectividad: " + formato.format(porcentaje*100) + "%");

		    }
		});
	}