Como validar un contador en java

Bueno antes que nada Hola
Espero y me puedan ayudar con mi problema ya que tengo rato que no se como solucionarlo.
Estoy haciendo un ventana en donde genero reportes a partir de la clave, nombre, ubicación y localización de la persona; pero también necesito el NUMERO DE REPORTE este me lo tiene que generar automáticamente eso ya lo logre hacer (con ayuda de aquí) empieza 1,2,3,4,... Etc.
Pero cuando cierro la ventana y la vuelvo abrir, el contador comienza de nuevo 1,2,3,4... Etc y pues no quiero que haga eso, QUIERO QUE COMIENCE A PARTIR DEL ULTIMO NUMERO GENERADO, es decir si quedo EN el 5 QUE comience en el 6; pero NO SE COMO VALIDARLO!
Ayuda!
Les dejo el código de como lo tengo GRACIAS
int contador=1;
jbReporte=new JButton("Reportes", new ImageIcon("iconos/reporte.png"));
     jp.add(jbReporte);
     jbReporte.setBounds(470,80,110,25);
     jbReporte.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent ae){
        JasperViewer jasperViewer;
        Connection con = null;
        Map<String, String> parametros = new HashMap<String, String>();
                         parametros.put("p_nom_per",jtfPer.getText());
                         parametros.put("p_nom_ubi",jtfUbi.getText());
                        parametros.put("p_nom_zona",jtfZona.getText());
                        parametros.put("p_num_rep",jtfReporte.getText());
                         parametros.put("nom_per","nom_ubi");
                     try{
                    try{
                              con = Conexion.getConexion();
                               contador++;
                                  JasperReport jasperReport = (JasperReport)JRLoader.loadObject("reportes/general.jasper");
                                  JasperPrint imprime =  JRFiller.fillReport(jasperReport,parametros,con);
                                  jasperViewer = new JasperViewer(imprime,false);
                                  jasperViewer.show();
          jtfReporte.setText(contador+"");
                             }catch(SQLException sqle){
                                System.out.println("No se logro la conexion  " + sqle.getMessage());
                             }
                         }catch (Exception e){
                          e.printStackTrace();
                         }
      }
     });

1 respuesta

Respuesta
1
Declara la variable contador como static (estática), con esto mantendrá su valor aun cuando cierres la ventana.
Gracias por contestar
Pero NO funciona la declare de las siguientes formas pero no:
public static int contador=1;
static int contador=1;
private static int contador=1;
No incialices la variable en la declaración, solo asígnale un valor cuando realmente la vayas a necesitar.
static int contador;
Gracias de nuevo por contestar
Pero si hago esto, yo voy a estar ingresando el numero de reporte, bueno en el numero que me quede y que tal si se me olvida el ultimo numero y/o lo repito.
¿Y pues no es lo que quiero o estoy entendiendo mal?
Lo que quiero es que guarde el ultimo numero del que yo me quede y cuando vuelva a abrir la ventana me muestre el siguiente numero, es decir
comienza 1,2,3,4,5 ----- cierro ventana
al abrir la ventana -----6,7,8,9... etc
Espero y me puedas ayudar y GRACIAS
Una variable estática mantiene su valor en todas las instancias de la clase a la que pertenezca, es decir si tu tienes una clase con una variable estática dentro de ella, y tu creas 10 instancias de esa clase, las 10 instancias compartirán el mismo valor de la variable, si alguna instancia cambia el valor de esa variable estática automáticamente todas las demás instancias verán el mismo valor, es decir, todas comparten la misma copia de la variable no cada una contiene una copia diferente como sucede cuando no son estáticas.
Ahora esta variable la tienes que tener declarada en la clase no dentro de un metodo, es decir algo asi
class Reporte(){
    static int contador;
    // metodos de la clase
}
¿Supongo qué el código que pegaste esta todo dentro de un método de una clase no?, eso explicaría porque no te funciona, ya que cada que ese método es llamada estas inicializando la variable de nuevo con el valor de 1 por lo que estas perdiendo el valor anterior. ¿En un dado caso de que no lo tuvieras así podrías pegar el código completo de la clase?
package inventario;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.applet.Applet;
import javax.swing.border.TitledBorder;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.io.InputStream;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.fill.*;
import net.sf.jasperreports.view.*;
public class ReportesFrm extends JFrame{
 JPanel jp;
 JComboBox jcbClaveper,jcbZona,jcbUbi;
 JTextField jtfPer,jtfUbi,jtfZona;
 JButton jbSalir,jbReporte,jbLimpiar;
 JLabel jlReporte,jlEmpleado,jlUbicacion,jlZona;
 JTextField jtfReporte;
 JComboBox jcbReporte;
 static int contador;
 Personal per = new Personal();
 ArrayList arrUbi=new ArrayList();
 Ubicacion ubi = new Ubicacion();
 ArrayList arrZona=new ArrayList();
 Zona zona = new Zona();
 public ReportesFrm(){
  super("Resguardos");
  jp = new JPanel(null);
  jlReporte = new JLabel("No. Reporte");
     jlReporte.setBounds(10,10,90,20);
     jp.add(jlReporte);
     jtfReporte = new JTextField();
     jtfReporte.setBounds(110,10,90,20);
     jtfReporte.setEditable(false);
     jp.add(jtfReporte);
    // jtfReporte.setText(contador+"");
     jlEmpleado = new JLabel("Empleado");
     jlEmpleado.setBounds(10,40,90,20);
     jp.add(jlEmpleado);
     jcbClaveper = new JComboBox();
     jcbClaveper.setBounds(10,60,90,20);
     jp.add(jcbClaveper);
     personal();
     jcbClaveper.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent ae){
    per = EquipoCtrl.buscar4((String)(jcbClaveper.getSelectedItem()));
       if(per!=null){
        jtfPer.setText(per.getnom_per());
        ubicacion();
       }else{
        JOptionPane.showMessageDialog(jp,"ERROR");
       }
   }
  });
  jtfPer = new JTextField();
     jtfPer.setBounds(110,60,350,20);
     jtfPer.setEditable(false);
     jp.add(jtfPer);
     jlUbicacion = new JLabel("Ubicacion");
     jlUbicacion.setBounds(10,90,90,20);
     jp.add(jlUbicacion);
  jcbUbi = new JComboBox();
     jcbUbi.setBounds(10,110,90,20);
     jp.add(jcbUbi);
     jcbUbi.addItemListener(new ItemListener(){
      public void itemStateChanged(ItemEvent ie){
       ubi = EquipoCtrl.buscar3((String)(jcbUbi.getSelectedItem()));
       if(ubi!=null){
        jtfUbi.setText(ubi.getnom_ubi());
        zona();
       }else{
        JOptionPane.showMessageDialog(jp,"ERROR");
       }
      }
     });
     jtfUbi = new JTextField();
     jtfUbi.setBounds(110,110,350,20);
     jtfUbi.setEditable(false);
     jp.add(jtfUbi);
     jlZona = new JLabel("Zona");
     jlZona.setBounds(10,140,90,20);
     jp.add(jlZona);
     jcbZona = new JComboBox();
     jcbZona.setBounds(10,160,90,20);
     jp.add(jcbZona);
     jcbZona.addItemListener(new ItemListener(){
      public void itemStateChanged(ItemEvent ie){
       zona = EquipoCtrl.buscar2((String)(jcbZona.getSelectedItem()));
       if(zona!=null){
        jtfZona.setText(zona.getnom_zona());
       }else{
        JOptionPane.showMessageDialog(jp,"ERROR");
       }
      }
     });
     jtfZona = new JTextField();
     jtfZona.setBounds(110,160,350,20);
     jtfZona.setEditable(false);
     jp.add(jtfZona);
  jbLimpiar=new JButton("Limpiar", new ImageIcon("iconos/limpiar.png"));
  jbLimpiar.setBounds(470,40,110,25);
  jp.add(jbLimpiar);
  jbLimpiar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
             jtfPer.setText("");
             jtfUbi.setText("");
             jtfZona.setText("");
             jcbUbi.removeAllItems();
             jcbZona.removeAllItems();
            }
        });
  jbReporte=new JButton("Reportes", new ImageIcon("iconos/reporte.png"));
     jp.add(jbReporte);
     jbReporte.setBounds(470,80,110,25);
     jbReporte.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent ae){  
        JasperViewer jasperViewer;
        Connection con = null;
        Map<String, String> parametros = new HashMap<String, String>();
                         parametros.put("p_nom_per",jtfPer.getText());
                         parametros.put("p_nom_ubi",jtfUbi.getText());
                        parametros.put("p_nom_zona",jtfZona.getText());
                        parametros.put("p_num_rep",jtfReporte.getText());
                         parametros.put("nom_per","nom_ubi");
                     try{
                    try{
                              con = Conexion.getConexion();
                               contador++;
                                  JasperReport jasperReport = (JasperReport)JRLoader.loadObject("reportes/general.jasper");
                                  JasperPrint imprime =  JRFiller.fillReport(jasperReport,parametros,con);
                                  jasperViewer = new JasperViewer(imprime,false);
                                  jasperViewer.show();
          jtfReporte.setText(contador+"");
                             }catch(SQLException sqle){
                                System.out.println("No se logro la conexion  " + sqle.getMessage());
                             }
                         }catch (Exception e){
                          e.printStackTrace();
                         }
      }
     });
  jbSalir=new JButton("Salir", new ImageIcon("iconos/salir.gif"));
     jp.add(jbSalir);
     jbSalir.setBounds(470,120,110,25);
     jbSalir.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent ae){
       dispose();
         }
     });
  //this.setFrameIcon(new ImageIcon("iconos/reporte.gif"));
  this.getContentPane().add(jp);
     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     this.setSize(600,230);
     this.setLocation(80,80);
     //this.setIconifiable(true);
  //this.setClosable(true);
     this.setVisible(true);
 }
 public void personal(){
  jcbClaveper.removeAllItems();
  ArrayList arrPer=PersonalCtrl.getPersonal();
  for(int i=0;i<arrPer.size();i++){
   jcbClaveper.addItem(arrPer.get(i));
  }
 }
 public void ubicacion(){
  jcbUbi.removeAllItems();
  arrUbi=ReportesCtrl.getUbicacion(String.valueOf(jcbClaveper.getSelectedItem()));
  for(int i=0;i<arrUbi.size();i++){
   jcbUbi.addItem(arrUbi.get(i));
  }
 }
 public void zona(){
  jcbZona.removeAllItems();
  arrZona=ReportesCtrl.getZona(String.valueOf(jcbUbi.getSelectedItem()));
  for(int i=0;i<arrZona.size();i++){
   jcbZona.addItem(arrZona.get(i));
  }
 }
 public static void main(String[]arg){
  new ReportesFrm();
 }
}
Veo que tienes un main y ahí creas la forma.
¿Cuándo te refieres a cerrar la ventana y volver a abrir, realmente te refieres a que terminas la aplicación y la vuelves a ejecutar verdad?
Si estoy en lo correcto de que realmente terminas la aplicación entonces este método no te va a servir, cuando terminas la aplicación todo se destruye, lo que tendrías que hacer es persistir ese valor en el disco, ya sea guardándolo en un archivo o serializando a disco la clase.
Este método de usar variables estáticas te funciona si no terminas la aplicación completa, es decir si esta ventana fuera parte de una aplicación y aunque cierres la ventana la aplicación sigue corriendo.
hooooo!
Muchas GRACIAS, tienes toda la razón ya lo probé y si funciona sin el main, ¿pero si cierro la aplicación se pierde la continuidad verdad?
Como puedo hacer lo que me comentas de guardar en un archivo la numeración por así decirlo, si me puedes ayudar de favor.
Gracias.
Lo más fácil seria que guardaras el valor en un archivo de texto y lo recuperaras al iniciar la aplicación.
Seria algo así para escribir el valor
BufferedWriter out = new BufferedWriter(new FileWriter("secuencia.txt"));
out.write(String.valueOf(contador));
out.close();
y para leer seria:
BufferedReader in = new BufferedReader(new FileReader("secuencia.txt"));
String str;
while ((str = in.readLine()) != null) { contador = Integer.parseInt(str); }
in.close();

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas