Autor Tema: ayuda como puedo modificar un archivo txt en java con interfaz  (Leído 1148 veces)

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: ayuda como puedo modificar un archivo txt en java con interfaz
« Respuesta #20 en: 22 de Abril 2021, 01:10 »
Bien, panel de Gestión de Unidades.
Muy similar al panel de Gestión de Terminales, cuenta también con un "modo gestión" y un "modo creación"
En este caso, hay que tener en cuenta que, si no existen Terminales, entonces no es posible crear Unidades. Porque las Unidades están asociadas a una Terminal.

Se podría permitir la creación de Unidades, y luego cuando se hayan creado Terminales, modificar las Unidades para asignarles una Terminal...
Pero para no complicar más el código, he hecho que si no hay Terminales, el botón de crear Unidad aparezca desactivado.

Para elegir Terminal, se usa un JComboBox que contiene las Terminales creadas en el sistema.
Esto es otra cosa a tener en cuenta, cada vez que añadamos o eliminemos una Terminal, habrá que actualizar también el panel de Gestión de Unidades para que la lista de Terminales sea correcta.

Esta es la clase que modela el panel de Gestión de Unidades:

Código: [Seleccionar]
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import terminal.Terminal;
import unidad.Unidad;

@SuppressWarnings("serial")
public class PanelUnidad extends JPanel{

private Unidad seleccion;
boolean modoGestion;
private JComboBox<Unidad> jcUnidades;
private JTextField jtPlaca;
private JComboBox<Terminal> jcTerminal;
private JSpinner spCapacidad;
private BotonOpcion btCrear;
private BotonOpcion btModificar;
private BotonOpcion btEliminar;
private JButton btVolver;

public PanelUnidad(Unidad[] unidades, Terminal[] terminales) {
jtPlaca = new JTextField(8);
jtPlaca.setEditable(false);
SpinnerNumberModel modelo = new SpinnerNumberModel();
modelo.setMaximum(36);
modelo.setMinimum(0);
spCapacidad = new JSpinner();
spCapacidad.setModel(modelo);
btCrear = new BotonOpcion("Crear<br>Unidad");
btModificar = new BotonOpcion("Modificar<br>Unidad");
btEliminar = new BotonOpcion("Eliminar<br>Unidad");
btVolver = new JButton("Volver Menú Administración");

jcTerminal = new JComboBox<Terminal>();
jcUnidades = new JComboBox<Unidad>();
jcUnidades.addItemListener(new AccionSeleccionarUnidad());
actualizarPanel(unidades, terminales);

setLayout(new BorderLayout());
add(new PanelNorte(), BorderLayout.NORTH);
add(new PanelCentro(), BorderLayout.CENTER);
add(new PanelSur(), BorderLayout.SOUTH);
}

private class PanelNorte extends JPanel {

public PanelNorte() {
JLabel titulo = new JLabel("Gestión de Unidades");
titulo.setFont(new Font("Verdana", Font.ITALIC, 36));
add(titulo);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(20, 20, 0, 20),
BorderFactory.createRaisedSoftBevelBorder()));
}
}

private class PanelCentro extends JPanel {

public PanelCentro() {
JPanel pnSup = new JPanel();
pnSup.add(new JLabel("Seleccione Unidad: "));
pnSup.add(jcUnidades);

JPanel pnCen = new JPanel();
pnCen.setLayout(new BoxLayout(pnCen, BoxLayout.Y_AXIS));

JPanel pnCen1 = new JPanel();
pnCen1.add(new PanelConComponente("Placa: ", jtPlaca));
pnCen1.add(new PanelConComponente("Terminal: ", jcTerminal));
JPanel pnCen2 = new JPanel();
pnCen2.add(new PanelConComponente("Capacidad: ", spCapacidad));
pnCen.add(pnCen1); pnCen.add(pnCen2);
pnCen.setBorder(BorderFactory.createTitledBorder("Datos de la Unidad"));

JPanel pnInf = new JPanel();
pnInf.setLayout(new GridLayout(1,3,10,10));
pnInf.add(btCrear); pnInf.add(btModificar); pnInf.add(btEliminar);
pnInf.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createRaisedSoftBevelBorder(),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));

setLayout(new BorderLayout());
add(pnSup, BorderLayout.NORTH);
add(pnCen, BorderLayout.CENTER);
add(pnInf, BorderLayout.SOUTH);
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
}
}

private class PanelConComponente extends JPanel {

public PanelConComponente(String texto, JComponent componente) {
add(new JLabel(texto)); add(componente);
}
}

private class PanelSur extends JPanel {

public PanelSur() {
JPanel pnBoton = new JPanel();
pnBoton.add(btVolver);
add(pnBoton);
}
}

private class BotonOpcion extends JButton {

public BotonOpcion(String texto) {
super("<html><p style=\"text-align:center\">" + texto + "</p></html>");
setFont(new Font("Verdana", Font.BOLD, 14));
setFocusPainted(false);
setBackground(new Color(102, 204, 255));
setForeground(Color.WHITE);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(),
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
setForeground(new Color(204, 0, 0));
}
@Override
public void mouseExited(MouseEvent e) {
setForeground(Color.WHITE);
}
});
}
}

public Unidad getUnidad() {
String placa = jtPlaca.getText();
int capacidad = (int) spCapacidad.getValue();
String terminal = ((Terminal)jcTerminal.getSelectedItem()).getNomTerminal();
return new Unidad(placa, capacidad, terminal);
}

public void setModoGestion() {
modoGestion = true;
if (jcUnidades.getItemCount() > 0) {
jcUnidades.setEnabled(true);
btModificar.setEnabled(true);
btEliminar.setEnabled(true);
spCapacidad.setEnabled(true);
jcTerminal.setEnabled(true);
mostrarSeleccionado();
}
else {
jcUnidades.setEnabled(false);
btModificar.setEnabled(false);
btEliminar.setEnabled(false);
spCapacidad.setEnabled(false);
jcTerminal.setEnabled(false);
}
btCrear.setText("<html><p style=\"text-align:center\">Crear<br>Unidad</p></html>");
}

public void setModoCrear() {
modoGestion = false;
jcUnidades.setEnabled(false);
jcTerminal.setEnabled(true);
spCapacidad.setEnabled(true);
btModificar.setEnabled(false);
btEliminar.setEnabled(false);
btCrear.setText("<html><p style=\"text-align:center\">Registrar<br>Unidad</p></html>");
}

public void setPlaca(String placa) {
jtPlaca.setText(placa);
}

private void mostrarSeleccionado() {
jtPlaca.setText(seleccion.getPlaca());
spCapacidad.setValue(seleccion.getCapacidad());
//Buscamos la terminal asociada
Terminal asociada = null;
for (int i = 0; i < jcTerminal.getItemCount(); i++) {
asociada = (Terminal) jcTerminal.getItemAt(i);
if (asociada.getNomTerminal().equals(seleccion.getNombreTerminal()))
break;
}

jcTerminal.setSelectedItem(asociada);
}

public void actualizarPanel(Unidad[] unidades, Terminal[] terminales) {
jcUnidades.removeAllItems();
jcTerminal.removeAllItems();
if (terminales.length > 0) {
btCrear.setEnabled(true); //Si hay Terminales, se pueden crear Unidades
for (Terminal ter: terminales)
jcTerminal.addItem(ter);
}
else {
btCrear.setEnabled(false);//No hay Terminales, imposible crear Unidades
}
if (unidades.length > 0) {
for (Unidad und: unidades)
jcUnidades.addItem(und);

jcUnidades.setSelectedIndex(unidades.length - 1);
seleccion = (Unidad) jcUnidades.getSelectedItem();
mostrarSeleccionado();
}

}

public void setAccionVolver(ActionListener accion) {
btVolver.addActionListener(accion);
}

public void setAccionCrear(ActionListener accion) {
btCrear.addActionListener(accion);
}

public void setAccionModificar(ActionListener accion) {
btModificar.addActionListener(accion);
}

public void setAccionEliminar(ActionListener accion) {
btEliminar.addActionListener(accion);
}

private class AccionSeleccionarUnidad implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
if (jcUnidades.getItemCount() > 0) {
seleccion = (Unidad)jcUnidades.getSelectedItem();
mostrarSeleccionado();
}
}
}
}

En la clase Main, hay que declararla, inicializarla, proporcionar acciones para sus botones y añadirla al Panel Principal.
Al Panel Administrador le damos también acción al botón que se encarga de mostrar este nuevo panel.
Citar
public class Main extends JFrame{

   //Usuario que ha logueado, puede ser Admin o Pasajero
   private Usuario logueado;

   //Gestores
   private GestorUsuario usuarios;
   private GestorTerminal terminales;
   private GestorUnidad unidades;

   //Paneles
   private PanelPrincipal pnPrincipal;
   private PanelLogin pnLogin;
   private PanelAdmin pnAdmin;
   private PanelPasajero pnPasajero;
   private PanelFormularioPasajero pnFormuPasajero;
   private PanelTerminal pnTerminal;
   private PanelUnidad pnUnidad;

   public Main() {

      usuarios = new GestorUsuario();
      terminales = new GestorTerminal();
      unidades = new GestorUnidad();
      pnPrincipal = new PanelPrincipal();
      pnLogin = new PanelLogin();
      pnLogin.setAccionBotonLogin(new AccionLogin());
      pnAdmin = new PanelAdmin();
      pnAdmin.setAccionLogout(new AccionLogout());
      pnAdmin.setAccionTerminal(new AccionAdministrarTerminal());
      pnAdmin.setAccionUnidad(new AccionAdministrarUnidad());
      pnPasajero = new PanelPasajero();
      pnPasajero.setAccionLogout(new AccionLogout());
      pnFormuPasajero = new PanelFormularioPasajero();
      pnFormuPasajero.setAccionRegistrar(new AccionRegistrar());
      pnFormuPasajero.setAccionCancelar(new AccionLogout());
      pnTerminal = new PanelTerminal(terminales.getArrayTerminales());
      pnTerminal.setAccionCrear(new AccionCrearTerminal());
      pnTerminal.setAccionModificar(new AccionModificarTerminal());
      pnTerminal.setAccionEliminar(new AccionBorrarTerminal());
      pnTerminal.setAccionVolver(new AccionVolverAdministracion());
      pnUnidad = new PanelUnidad(unidades.getArrayUnidades(), terminales.getArrayTerminales());
      pnUnidad.setAccionCrear(new AccionCrearUnidad());
      pnUnidad.setAccionModificar(new AccionModificarUnidad());
      pnUnidad.setAccionEliminar(new AccionBorrarUnidad());
      pnUnidad.setAccionVolver(new AccionVolverAdministracion());

      

      //Añadimos cada panel al panel principal.
      pnPrincipal.add(pnLogin, "login");
      pnPrincipal.add(pnAdmin, "admin");
      pnPrincipal.add(pnPasajero, "pasajero");
      pnPrincipal.add(pnFormuPasajero, "formuPasajero");
      pnPrincipal.add(pnTerminal, "terminal");
      pnPrincipal.add(pnUnidad, "unidad");


      setContentPane(pnPrincipal);

      setTitle("Gestion de Terminales");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

Esta es la acción para mostrar el nuevo panel:
Código: [Seleccionar]
private class AccionAdministrarUnidad implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
pnUnidad.setModoGestion();
pnPrincipal.mostrarPanel("unidad");
}
}

Aquí la acción para crear Unidad, y además modificamos la acción crear Terminal para que al crear una Termina, también se actualice el panel de Unidades.

Citar
   private class AccionCrearTerminal implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         
         if (pnTerminal.modoGestion) {
            //Si está en "modo gestion", pasamos al "modo crear"
            pnTerminal.setModoCrear();
            pnTerminal.setID(terminales.generaID());
         }
         else {
            /*
             * Si está en "modo crear", comprobaremos si hay datos
             * para crear una Terminal, registrarla y volver al
             * "modo gestion"
             */
            Terminal nueva = pnTerminal.getTerminal();
            if (nueva != null) {
               if (terminales.registrarTerminal(nueva)) {
                  //Si la terminal ha sido aceptada, hay que actualizar el panel Terminal
                  pnTerminal.actualizarPanel(terminales.getArrayTerminales());
                  //El panel de gestión de Unidades se actualiza para visualizar la nueva Terminal
                  pnUnidad.actualizarPanel(unidades.getArrayUnidades(), terminales.getArrayTerminales());
                  pnTerminal.setModoGestion();
               }
            }
         }
         
      }
   }
   
   private class AccionCrearUnidad implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         if (pnUnidad.modoGestion) {
            pnUnidad.setModoCrear();
            pnUnidad.setPlaca(unidades.getPlaca());
         }
         else {
            Unidad nueva = pnUnidad.getUnidad();
            if (nueva != null) {
               if (unidades.registrarUnidad(nueva)) {
                  pnUnidad.actualizarPanel(unidades.getArrayUnidades(), terminales.getArrayTerminales());
                  pnUnidad.setModoGestion();
               }
            }
         }
         
      }
   }

Modificar Unidad:
Código: [Seleccionar]
private class AccionModificarUnidad implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Unidad modificada = pnUnidad.getUnidad();
if (modificada != null)
unidades.modificarUnidad(modificada);
}
}

Y Eliminar Unidad, que también modificamos la acción de Eliminar Terminal para que actualice panel de Unidades.

Citar
   private class AccionBorrarTerminal implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         Terminal borrar = pnTerminal.getTerminal();
         if (borrar != null) {
            if (terminales.borrarTerminal(borrar)) {
               JOptionPane.showMessageDialog(null, "Terminal Eliminada",
                     "Eliminar Terminal", JOptionPane.INFORMATION_MESSAGE);
               pnTerminal.actualizarPanel(terminales.getArrayTerminales());
               pnUnidad.actualizarPanel(unidades.getArrayUnidades(), terminales.getArrayTerminales());
            }
         }
      }   
   }
   
   private class AccionBorrarUnidad implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         Unidad borrar = pnUnidad.getUnidad();
         if (borrar != null) {
            if (unidades.borrarUnidad(borrar)) {
               JOptionPane.showMessageDialog(null, "Unidad Eliminada",
                     "Eliminar Unidad", JOptionPane.INFORMATION_MESSAGE);
               pnUnidad.actualizarPanel(unidades.getArrayUnidades(), terminales.getArrayTerminales());
            }
         }
         
      }
   }

Y creo que esos son todos los cambios que se han tenido que hacer.
Ahora ya podemos crear Terminales y Unidades, lo siguiente serán las Rutas.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".