12
					
						
						« en: 11 de Junio 2018, 05:18 »
					 
					
					Holaa! Me ha surgido una gran duda, ya implemente el método de modificación, lo habia estado revisando y estaba bien. Pero quería mover ese método a otra clase, pero al momento de ejecutarse no modifica,  tendría que agregarle algo a todos los metodos si los quisera mover a otra clase?
Gracias.
Esta es la clase Métodos, a esta recientemente le habia agregado la modificacion
import javax.swing.JOptionPane;
import java.io.*;
import java.util.ArrayList;
public class Metodos {
	private File archivo = new File("archiyect.txt");
	private ArrayList<Medicamentos> medicamentos = new ArrayList<>();
	
	public Metodos()
	{
		/*
		 * El constructor de Metodos lo que hará es comprobar si ya existe un 
		 * archivo con datos de Medicamentos ya creado.
		 * Si existe, recuperará estos datos, creará objetos Medicamentos y los
		 * pasará al ArrayList desde donde podremos trabajar con ellos.
		 * Si no existe, no hará nada, tendremos un ArrayList vacio listo para
		 * que podamos hacer las primeras altas.
		 */
		if (archivo.exists())
		{
			try {
				BufferedReader leer = new BufferedReader(new FileReader(archivo));
				String linea = leer.readLine();
				while(linea != null)
				{
					/*
					 * Separamos los atributos del Medicamento de la linea que hemos leido 
					 * En la linea los atributos estan separados por un doble guion "--"
					 * La linea contendrá los 8 atributos correspondientes a un Medicamento.
					 * Sin embargo, los 4 últimos es posible que no tengan datos validos, si no que
					 * puede que contengan valores null y 0, ya que los únicos atributos que son 
					 * de obligatoria cumplimentación son los primeros 4.
					 */
					
					String[] atributos = linea.split("--");
					//Los 4 atributos obligatorios
					String clave = atributos[0];
					String nombre = atributos[1];
					int precio = Integer.parseInt(atributos[2]);
					int existencia = Integer.parseInt(atributos[3]);
					
					/*
					 * Ahora recogemos los 4 atributos opcionales.
					 * Los de tipo String, si no fueron cumplimentados,
					 * tendrían valor null  y en el archivo de texto se
					 * habrá escrito la palabra "null". Sin embargo,
					 * al leer del archivo estamos recibiendo un String
					 * con el texto "null". No podemos pasar este texto
					 * directamente al atributo, sino que en este caso
					 * debemos pasar el valor null, que no es lo mismo 
					 * que un string con el texto "null". Son cosas distintas.
					 */
					String nombreGenerico;
					if (atributos[4].equals("null"))//Este atributo tenía valor null cuando se guardo en el archivo
						nombreGenerico = null;
					else
						nombreGenerico = atributos[4];
					
					int caducidad = Integer.parseInt(atributos[5]);
					
					String formaFarmaceutica;
					if (atributos[6].equals("null"))
						formaFarmaceutica = null;
					else
						formaFarmaceutica = atributos[6];
					
					int concentracion = Integer.parseInt(atributos[7]);
					
					/*
					 * Ya tenemos los 8 atributos.
					 * Podemos añadir al ArrayList un nuevo Medicamento.
					 */
					
					medicamentos.add(new Medicamentos(clave, nombre, precio, existencia, nombreGenerico,
							caducidad, formaFarmaceutica, concentracion));
					//Medicamento añadido, leemos una nueva linea y si contiene datos, se repetirá este proceso
					linea = leer.readLine();
				}
				leer.close();
				//Lectura concluida.
				//Podemos informar por pantalla cuantos Medicamentos hemos recuperado del archivo
				JOptionPane.showMessageDialog(null, "Cantidad de Medicamentos recuperados: " + medicamentos.size(),
						"Datos Leidos", JOptionPane.INFORMATION_MESSAGE);
			} catch (Exception ex)
			{
				JOptionPane.showMessageDialog(null, "No se pudo leer datos del archivo: " + archivo.getAbsolutePath(),
						"Error de Lectura", JOptionPane.WARNING_MESSAGE);
			}
		}
	}
	
	public void altas() throws FileNotFoundException,IOException
	{
		/*
		 * Los Medicamentos tienen 8 atributos, pero para su creacion solo 
		 * son obligatorios propocionar 4. En este ejemplo solo pediremos
		 * los 4 atributos obligatorios. 
		 */
		String clave = JOptionPane.showInputDialog("Dame la clave del producto");
		String nombre = JOptionPane.showInputDialog("Escribe el nombre del producto");
		int precio = Integer.parseInt(JOptionPane.showInputDialog("Escribe el precio del producto"));
		int existencia = Integer.parseInt(JOptionPane.showInputDialog("Cuántos productos hay en existencia"));
		/*
		 * Tenemos los 4 atributos.
		 * Crearemos un Medicamento y lo añadiremos al ArrayList.
		 * Luego, lo añadiremos al archivo de texto en disco.
		 */
		Medicamentos nuevoMed = new Medicamentos(clave, nombre, precio, existencia); 
		medicamentos.add(nuevoMed);
		
		try{
			BufferedWriter escribir = new BufferedWriter(new FileWriter(archivo, true));
			escribir.write(nuevoMed.toString());
			escribir.newLine();
			escribir.close();
		}catch(IOException e){
			JOptionPane.showMessageDialog(null, "No se pudo escribir datos en archivo: " + archivo.getAbsolutePath(),
					"Error de Escritura", JOptionPane.WARNING_MESSAGE);
		}
	}
	
	/**
	 * Este metodo contruye un String con todos los datos de un 
	 * Medicamento para ser mostrado en pantalla.
	 * Es útil porque puede ser utilizado para las funciones 
	 * de listado, búsqueda por clave, busqueda por nombre.. 
	 * @param m Objeto Medicamentos que queremos mostrar.
	 * @return Cadena String con todos los datos
	 */
	private String mensajeMedicamento(Medicamentos m)
	{
		return "Clave: " + m.getClave()
		+ "\nNombre: " + m.getNombre()
		+ "\nPrecio: " + m.getPrecio()
		+ "\nExistencias: " + m.getExistencia()
		+ "\nNombre Generico: " + m.getNombregenerico()
		+ "\nCaducidad: " + m.getCaducidad()
		+ "\nForma Farmaceutica: " + m.getFormafarmaceutica()
		+ "\nConcentracion: " + m.getConcentracion();
	}
	public void listado()
	{
		/*
		 * Recorremos el ArrayList y por cada Medicamento existente
		 * construimos un mensaje con los datos y lo mostramos en un
		 * Dialogo de Confirmacion.
		 * El usuario tiene la oportunidad de finalizar el listado pulsando
		 * el boton NO de este dialogo.
		 * Antes de nada, por supuesto, hemos de comprobar si existen medicamentos
		 * ya registrados
		 */
		if (medicamentos.isEmpty())
			JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
		else
		{
			for (int i = 0; i < medicamentos.size(); i++)
			{
				/*
				 * Para mostrar el medicamento usamos el String que nos devuelve el metodo
				 * mensajeMedicamento() y además le añadimos otra linea indicando al usuario
				 * que puede detener el listado pulsando el boton NO de la ventana de dialogo.
				 * Esta ventana, en su título superior, además mostrará el número de posicion
				 * que ocupa este Medicamento en el ArrayList y el total que hay.
				 * Un mensaje tipo ---> Medicamento nº 4/30
				 * Así el usuario tendrá una idea de cuantos Medicamentos quedan por listar.
				 */
				String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea seguir visualizando el listado?";
				
				int seguir = JOptionPane.showConfirmDialog(null, mensaje, "Medicamento nº " + (i+1) + "/" + medicamentos.size(), JOptionPane.YES_NO_OPTION);
				
				if (seguir == JOptionPane.NO_OPTION)//Usuario NO quiere seguir con el listado, "rompemos" el bucle
					break;
			}
		}
	}
	//CONSULTA POR CLAVE
	public void consultasc()
	{
		if (medicamentos.isEmpty())
			JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
		else
		{
			String clave = JOptionPane.showInputDialog("Introduzca clave del medicamento a buscar:");
			
			/*
			 * Recorremos el ArrayList mediante un bucle FOR EACH para buscar el Medicamento con
			 * la clave que nos han indicado.
			 * Si lo encontramos, mostramos sus datos y detenemos el bucle de búsqueda.
			 * Si no lo encontramos, habría que informar al usuario de que no existe dicha clave.
			 * Para controlar si hemos encontrado o no el Medicamento, podemos usar una variable
			 * booleana. Esta variable comenzará con valor false.
			 * Si lo encontramos, la pondremos a true.
			 * Al terminar el bucle de busqueda, si esta variable conserva el valor false inicial,
			 * sabremos que el Medicamento no fue encontrado e informaremos al usuario.
			 */
			boolean encontrado = false;
			for (Medicamentos m:medicamentos)
			{
				if (m.getClave().equalsIgnoreCase(clave))
				{
					encontrado = true;//¡¡Lo hemos encontrado!!
					JOptionPane.showMessageDialog(null, mensajeMedicamento(m), "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
				}
			}
			//Bucle de busqueda terminado, hemos de comprobar si fue encontrado el medicamento o no
			if (!encontrado)
				JOptionPane.showMessageDialog(null, "No se encontro medicamento con clave: " + clave, "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
		}
		
	}
	//CONSULTA POR NOMBRE
	public void consultasn()
	{
		//consultas por nombre
      if (medicamentos.isEmpty())
			JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
		else
		{
			String nombre = JOptionPane.showInputDialog("Introduzca nombre del medicamento a buscar:");
			
			/*
			 * Recorremos el ArrayList mediante un bucle FOR EACH para buscar el Medicamento con
			 * el nombre que nos han indicado.
			 * Si lo encontramos, mostramos sus datos y detenemos el bucle de búsqueda.
			 * Si no lo encontramos, habría que informar al usuario de que no existe dicho nombre.
			 * Para controlar si hemos encontrado o no el Medicamento, podemos usar una variable
			 * booleana. Esta variable comenzará con valor false.
			 * Si lo encontramos, la pondremos a true.
			 * Al terminar el bucle de busqueda, si esta variable conserva el valor false inicial,
			 * sabremos que el Medicamento no fue encontrado e informaremos al usuario.
			 */
			boolean encontrado = false;
			for (Medicamentos m:medicamentos)
			{
				if (m.getNombre().equalsIgnoreCase(nombre))
				{
					encontrado = true;//¡¡Lo hemos encontrado!!
					JOptionPane.showMessageDialog(null, mensajeMedicamento(m), "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
				}
			}
			//Bucle de busqueda terminado, hemos de comprobar si fue encontrado el medicamento o no
			if (!encontrado)
				JOptionPane.showMessageDialog(null, "No se encontro medicamento con ese nombre: " + nombre, "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
		}
      
	}
	public void bajas()throws FileNotFoundException,IOException
	{
		/*
		 * El metodo para hacer bajas es muy parecido al metodo de consulta por clave.
		 * Solo que esta vez al encontrar el medicamento, este ha de ser eliminado del 
		 * ArrayList y también del fichero de texto donde guardamos los datos.
		 * Borrar del ArrayList se hace con una sencilla instruccion.
		 * Borrar la linea de datos del archivo de texto, es un poco más laborioso.
		 * Para facilitar la tarea, lo ideal es eliminar el archivo por completo
		 * y volver a crearlo de nuevo con todos los Medicamentos contenidos en el 
		 * ArrayList, donde ya no estará el Medicamento que hemos dado de baja.
		 */
		if (medicamentos.isEmpty())
			JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
		else
		{
			String clave = JOptionPane.showInputDialog("Introduzca clave de Medicamento a eliminar:");
			boolean encontrado = false;//Para controlar si lo hemos encontrado
			boolean borrado = false;//Para controla si el usuario ha decidido eliminarlo
			for (int i = 0; i < medicamentos.size(); i++)
			{
				if (medicamentos.get(i).getClave().equalsIgnoreCase(clave))
				{
					encontrado = true;
					String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea dar de baja?";
					int confirmar = JOptionPane.showConfirmDialog(null, mensaje, "Confirmar Baja", JOptionPane.YES_NO_OPTION);
					if (confirmar == JOptionPane.YES_OPTION)//SI quiere dar de baja
					{
						//Eliminamos del ArrayList
						medicamentos.remove(i);
						borrado = true;
					}
				}
			}
			/*
			 * Bucle de busqueda terminado ahora comprobamos si el Medicamento fue encontrado o no.
			 * Si no fue encontrado, informamos al usuario con un mensaje
			 * Si fue encontrado y eliminado guardaremos los datos actualizados en el archivo de texto.
			 * Para crear este archivo habrá que recorrer de nuevo el ArrayList y añadir una linea de texto
			 * por cada Medicamento que contenga.
			 */
			if (encontrado && borrado)
			{
				try {
					//Intentamos borrar archivo actual
					if (archivo.delete())
					{
						//Archivo borrado, creamos uno nuevo actualizado
						BufferedWriter escribir = new BufferedWriter(new FileWriter(archivo, true));
						for (Medicamentos m:medicamentos)
						{
							escribir.write(m.toString());
							escribir.newLine();
						}
						escribir.close();
						JOptionPane.showMessageDialog(null, "Medicamento eliminado.\nLos cambios se han guardado", "Baja de Medicamento",
								JOptionPane.INFORMATION_MESSAGE);
					}
					else//Por algun motivo, no se pudo borrar archivo
					{
						JOptionPane.showMessageDialog(null, "Error de acceso a archivo.\nLos cambios no han sido guardados", "Baja de Medicamento",
								JOptionPane.WARNING_MESSAGE);
					}
				} catch(Exception ex) {
					JOptionPane.showMessageDialog(null, "Error de acceso a archivo\nTipo de error: " + ex.getLocalizedMessage());
				}
			}
			else if(!encontrado)//No fue encontrado
			{
				JOptionPane.showMessageDialog(null, "NO se encontro Medicamento con la clave: " + clave, "Baja de Medicamentos",
						JOptionPane.INFORMATION_MESSAGE);
			}
	
		}
	}
   
  /* public void modificacion()throws FileNotFoundException,IOException
   {
   if (medicamentos.isEmpty())
			JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
		else
		{
			String clave = JOptionPane.showInputDialog("Introduzca la clave del Medicamento para modificar:");
			boolean encontrado = false;//Para controlar si lo hemos encontrado
			boolean borrado = false;//Para controla si el usuario ha decidido eliminarlo
			for (int i = 0; i < medicamentos.size(); i++)
			{
				if (medicamentos.get(i).getClave().equalsIgnoreCase(clave))
				{
					encontrado = true;
					String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea modificar este medicamento?";
					int confirmar = JOptionPane.showConfirmDialog(null, mensaje, "Confirmar Baja", JOptionPane.YES_NO_OPTION);
					if (confirmar == JOptionPane.YES_OPTION)//SI quiere modificar
					{
		            medicamentos.remove(i);
                  borrado = true;
                  String claved = JOptionPane.showInputDialog("cual es la nueva clave del producto");
                  String nombre = JOptionPane.showInputDialog("cual es el nuevo nombre del producto");
		            int precio = Integer.parseInt(JOptionPane.showInputDialog("cual es el nuevo precio del producto"));
		            int existencia = Integer.parseInt(JOptionPane.showInputDialog("Cuántos productos hay en existencia"));
                  
                  Medicamentos nuevoMed = new Medicamentos(claved,nombre, precio, existencia); 
		            medicamentos.add(nuevoMed);
		
		       
			      borrado = true;
					}//
               else{
				   JOptionPane.showMessageDialog(null, "NO se encontro Medicamento con la clave: " + clave, "Baja de Medicamentos",
					JOptionPane.INFORMATION_MESSAGE);
			      }
            }
	      }			   
      }
   }*/
}El método de modificacion lo puse en comentario porque la quiero mover a otra clase