Métodos públicos de JFrame a JFrame

babri

Estoy haciendo un programa que tira de una base de datos Access en Java, el programa tira de dicha base de datos y saca los datos de cada empleado que tengo dado de alta. Además me muestra sus nóminas.

Me funciona bien de momento, os muestro como lo tengo:

  • Cuando le doy a las flechas me muevo por los empleados y en la tabla cargo sus nóminas.

  • Si le doy a nuevo me borra la tabla y los datos de los campos para que puedo escribir los datos del nuevo empleado, para luego darle a guardar y se almacena en la base de datos.

  • Si le doy a borrar me borra el empleado de la base de datos y del programa como es lógico.

Mi idea no es que funcione así, si no que al darle al botón "nuevo" que pasaría a llamarse "Editar" se despliegue un nuevo JFrame con los datos del empleado en el que estamos y ahi ya editemos sin problema.

Esto me funciona así:

Como veis me carga sin problemas los datos y se le doy a "Editar" guarda en la base de datos sin problema.

Ahora es cuando tengo el problema, cuando cierro la ventana de editar, me tiene que refrescar los datos editado en la primera ventana, pero no consigo hacerlo. Mi forma de pasar los datos es haciendo un variable pública y static así:

public static String DNIPublica;

Y entonces pueda usarla en el otro formulario, pero para mostrar los datos los tengo en un método:

public void mostrarEmpleados() throws SQLException {
        try {
            txtDni.setText(rsm.getString("DNI"));
            txtNombre.setText(rsm.getString("Nombre"));
            txtApellido.setText(rsm.getString("Apellido"));
            txtNacimiento.setText(rsm.getString("Nacimiento"));
            DNInomina = txtDni.getText();
            conectarNominas(DNInomina);
        } catch (Exception e) {
            System.out.println("No se pueden mostrar los datos correctamente");
        }
    }

Y no se como podría usar dicho método en el otro formulario o como al cerrar la otra ventana se me refresque los datos.

El botón editar del segundo JFrame lo tengo así:

private void btnEditarMouseClicked(java.awt.event.MouseEvent evt) {                                       
try { // TODO add your handling code here: //JOptionPane.showMessageDialog(null, "DNI:"+DNIJFrame); rsm.updateString("DNI", txtDNI.getText()); rsm.updateString("Nombre", txtNombre.getText()); rsm.updateString("Apellido", txtApellido.getText()); rsm.updateString("Nacimiento", txtFecha.getText()); rsm.updateRow(); JOptionPane.showMessageDialog(null, "Trabajador Editado correctamente"); this.setVisible(false); EmpresaJFrame jf = new EmpresaJFrame(); jf.mostrarEmpleados(); } catch (SQLException ex) { Logger.getLogger(EditarJFrame.class.getName()).log(Level.SEVERE, null, ex); }
}

Muchas gracias! :D

Khanser

Cuando crees el objeto JFrame pop up que se te abre para editar o crear, crea un nuevo constructor y le pasas el objeto del JFrame "padre", lo guardas en algun atributo, y despues de ocultar la visibilidad del popup, llamas al metodo del jframe padre que carga los datos de los empleados en esa lista tan maja que tienes.

Tambien puedes personalizarte el objeto de la lista de empleados del JFrame gordo de tal manera que sobrecargues el metodo "paint" del objeto para que cargue los datos desde access (haciendo otro super.paint(g) al finalizar para que pinte los objetos que acabas de añadir) de esta manera cada vez que "repinte" la pantalla, irá a buscar los datos a Access (aunk esta opcion no me gusta mucho, te recomiendo mas la primera)

1 respuesta
babri

#2 ¿sería aquí?

private void btnNuevoMouseClicked(java.awt.event.MouseEvent evt) {                                      
// TODO add your handling code here: //txtDni.setText(""); //txtNombre.setText(""); //txtApellido.setText(""); //txtNacimiento.setText(""); //conectarNominas(""); //nuevo = true; DNIPublica = txtDni.getText().toString(); EditarJFrame editar = new EditarJFrame(); editar.setLocationRelativeTo(null); editar.setTitle("DAM2 Empresa Editar"); editar.setVisible(true); }

ahí es donde hago visible el nuevo JFrame

creo un constructor de esta manera:

public EmpresaJFrame(JTextField txtApellido, JTextField txtDni, JTextField txtNacimiento, JTextField txtNombre) {
        this.txtApellido = txtApellido;
        this.txtDni = txtDni;
        this.txtNacimiento = txtNacimiento;
        this.txtNombre = txtNombre;
    }

no me queda muy claro como puedo decirle que refresque :s

MTX_Anubis

No uses variables estáticas y publicas para pasar información que no sean constantes por dios!

Eso se hace mediante listeners, el JFrame principal se registra como listener del popup, cuando este pulse en editar, guardas la información y se lo comunicas al listener, que lo que hará es refrescar lainformación.

algo así


public interfaze Listener {
   void onActionPerformed();
}

Así o en una clase privada que gestione esto

public class JFrame implements Listener {
  // Todo tu codigo

  public void onActionPerformed() {
    reloadData();
  }
}

Y cuando vayas a enseñar el popup

MyFrame m = new MyFrame(myListener);
m.setData(...); //la informacion del contacto
m.show();

Cuando pulsas en el botón editar:


//Codigo que guarda la info en BBDD
myListener.onActionPerformed();

Obviamente, los nombres de las clases y demás, ponlos segun gusto xD

1 2 respuestas
babri

#4 no entiendo eso de Listener, nunca los he usado.

no se donde estás almacenando la información :S

1 respuesta
Khanser

La propuesta de #4 no la he puesto porque no sabia si sabrias por donde van los tiros pero te lo voy a explicar lo mejor que pueda.

La idea es que en tu JFrameEmpresa tienes un metodo que va a access a buscar los registros y los pinta en la lista verdad? llamemos a este metodo "mostrarLista()"

La idea es hacerte por ejemplo una clase aislada que se encargue de manejar estos "eventos" de aplicacion, por ejemplo:

class EventManager{
    private static EventManager instance;
    private Set<ElementsInListListener> elementsInListChanged;
    private EventManager(){
        elementsInListChanged = new HashSet<ElementsInListListener>();    
} public static EventManager getInstance(){ if(instance == null){ instance = new EventManager(); } return instance; }
public void addElementsInListChangedListener(ElementsInListListener l){ elementsInListChanged.add(l); } public void fireElementsInListChangedListener(){ for(ElementsInListListener l:elementsInListChanged){ l.fireElementsInListChanged(); } } }

Con la interface ElementsInListListener como

public interface ElementsInListListener{
    public void fireElementsInListChanged();
}

Tu JFrameEmpresa implementara ElementsInListListener y en su constructor tendras que registrarte como "listener" haciendo

EventManager.getInstance().addElementsInListChangedListener(this);

al implementar ElementsInListListener tendras que dar cuerpo a fireElementsInListChanged y su ejecucion llamara al metodo al principio citado "mostrarLista()"

Desde donde se ejecuta todo esto??, pues desde cada sitio donde alteres informacion de la lista y necesites que los demas elementos de tu aplicacion sepan que ha habido cambios, en este caso y como ejemplo, cuando le das a "aceptar" en tu jframe de edicion de datos con algo asi:

EventManager.getInstance().fireElementsInListChanged();

Dando el escopetazo de salida a informar a todos aquellos objetos que quieren enterarse que has modificado datos.

Por lo que al final el metodo "mostrarlista()" lo llamas desde 2 sitios, desde el constructor o tu metodo de inicialización en tu JFrame Empresa y desde el metodo del fireElements...() en la implementacion del listener.

PD: lo he picado todo al vuelo, es posible que se escape algun error de compilacion :p

PD2: #5 Sigues tus propios posts? :/

1 1 respuesta
7 días después
babri

#6 si jaja de hecho ya avancé, muchas gracias por la info ^^

lo hice de otra formas un poco más rudimentaria, pero me ha servido lo que me habéis comentado para otras cosas ^^

Usuarios habituales

  • babri
  • Khanser
  • MTX_Anubis