Select retornando valor[RESOLVIDO]

Bem galere, sou novato em java, estou fazendo um curso profissionalizante na IFPR a 6 meses, e estou desenvolvendo um sistema de vendas e estoque, isso por que já o desenvolvia em Delphi, mas como em todos os cursos, existem alunos que teêm mais dificuldades em aprende que outros, deixando assim o curso mais lento, então por fora do curso estou estudando e vendo foruns, apostilas e todo ensinamento que for possivel aproveitar, agora estagnei num ponto que preciso da ajuda de vocês, por exemplo, no cadastro de produtos, quando abro a tela, ele aparece todos campos, e já da um click no botão cancelar, onde vai limpa todos os campos e puxar o codigo do ultimo cadastro + 1, para que seja sequencial o cadastro, mas esse é o problema, por se tratar de um select que irá me trazer um retorno, não estou conseguindo puxar a informação e colocar no JTextField, segue meu codigo:

 private void BtoCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        //limpa todos os campos do formulario

        for (int i = 0; i < getContentPane().getComponentCount(); i++) {
            //varre todos os componentes
            Component c = getContentPane().getComponent(i);
            if (c instanceof JTextField) {
                //apaga os valores
                JTextField field = (JTextField) c;
                field.setText("");
            }
        }
        //terminou de limpar os campos
        //agora verifica se o está selecionado como inativo o ultimo cadastro aberto e limpa se estiver       
        if (EdtInativo.isSelected()) {
            EdtInativo.setSelected(false);
        }
        inativoCheck();
       try {
            pegacodigo();
        } catch (Exception ex) {
            Logger.getLogger(cadastroProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
      
        EdtCodigo.requestFocus();
    }                                           
    public static void pegacodigo() throws java.sql.SQLException, Exception {
        String StrSql = "Select max(codpro+1) as codigo from cadpro;";
        try {
            consulta(StrSql);
        } catch (SQLException ex) {
            Logger.getLogger(cadastroProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
        EdtCodigo.setText(codigo);

    }

esse é no cadastroproduto, agora no coxecao:


 public static void consulta(String consultar) throws java.sql.SQLException, Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/upinfo", "root", "senha1");
            con.setAutoCommit(false);
            PreparedStatement stmt = con.prepareStatement(consultar);
            ResultSet rs = stmt.executeQuery();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } 
        finally{
        return codigo;
        }
    }

O problema é que não posso ficar perguntando no curso porque o professor diz que atrapalha o andamento das aulas e os outros alunos não irão entender o que estou fazendo

Uma dúvida. Porque acrescentar +1 ao valor final, quando poderia simplesmente criar o seu “codpro” como “serial”? Tipo:

create table produtos (

codpro serial not null,
nomepro varchar(30) not null, // etc…
etc…
etc…
e etc…
)

Se for apenas pela questão de cadastrar novos produtos seguindo a sequencia numérica e sem repetição, creio que assim seria mais simples. A não ser, que seu programa tenha a necessidade de mostrar o código do próximo produto à ser cadastrado.

Essa é a ideia, mostrar o próximo codigo livre para um novo cadastro, não impedindo que o usuário digite um código aleatório, trabalho com sistemas que ao abrir o cadastro de produto, carregam um dbgrid(nome no Delphi, no java acho que é utilizado uma tabela) o cadastro inteiro, deixando assim o sistema mais lento quando se tem um cadastro com muitos produtos, até vou fazer isso, mas somente quando for fazer uma pesquisa nos produtos, ao abrir o cadastro, a tela já estará pronta para um novo cadastro, deixando essa parte mais ágil, acredito eu pelo menos, por isso gostaria de que ao abrir a tela de cadastro, já apareça o próximo código livre, alguma ideia de como fazer, no Delphi foi facil, mas como já disse, estou entrando em Java e gostaria de saber fazer, aprender profundamente e um dia quem sabe estar aqui difundindo meu conhecimento, desde já agradeço mauriciozaccaro

Olha, sou novo em programação também, contudo, vou tentar te ajudar.

Há várias maneiras de fazer isso, vou exemplificar 2 (duas).

A 1° é montar a Tabela no Banco de Dados já com a opção de " codpro serial not null ". Porquê?
Quando você diz que o seu ID ( no seu caso o codpro) é “serial not null”, está dizendo que ele vai vir em série continuamente, “1, 2, 3, 4 etc…” e que o campo jamais será nulo. Com isso, ao acrescentar um produto ao Banco o próprio Banco vai gerar um ID sequencial para ele, não podendo assim ser alterado pelo Usuário comum.

A 2° maneira é a que você escolheu. Dar um “Select” no banco afim de buscar o ultimo dado e acrescentar +1 ao seu resultado. Nesse caso, acrescente na sua classe consulta, logo abaixo do seu stmt.executeQuery() um “rs.next” e um rs.getString ou getInt, o que melhor lhe ajudar, não esquecendo claro, de converter caso necessário. Aqui pra mim ficou mais ou menos assim:

  public void pegarCodigo(){
        String sql = null;
        sql = "select Max(id+1) as id from personagem";
        
       try {
           pst = con.prepareStatement(sql);           
           rs = pst.executeQuery();
           if(rs.next()){
           txtCodigo.setText(rs.getString("id")); // txtCodigo é o TextField que vai mostrar o código para o próximo cadastro
           }else{
           JOptionPane.showMessageDialog(null, "testando um erro atoa");
           }
       } catch (SQLException ex) {
           Logger.getLogger(frmPersonagem.class.getName()).log(Level.SEVERE, null, ex);
       }
    }

Bom, fiz isso rapidinho pra ver se te dá uma luz ai. Só pegar a ideia e incrementar no seu projeto.
Espero ter ajudado.

Valeu mauriciozaccaro, funcionou, de certa forma, colocando todo o codigo dentro de um metodo, a pricipio vou deixar assim, o problema maior era fazer isso vindo de outro bloco(metodo), pois isso está no cadasroproduto que chamava o conexao.consulta e trazer essa informação era o maior problema, mas funcionou como gostaria, acredito que no outros cadastros terei o mesmo problema, mas até conseguir entender como realmente trazer essa informação de outros modulos irei fazendo assim, apesar de estar repetindo codigos, mas, como funcionou, muito obrigado
André Batista

Então até eu conseguir puxar dados de outro metodo ficou assim o codigo:

private void BtoCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        //limpa todos os campos do formulario

        for (int i = 0; i < getContentPane().getComponentCount(); i++) {
            //varre todos os componentes
            Component c = getContentPane().getComponent(i);
            if (c instanceof JTextField) {
                //apaga os valores
                JTextField field = (JTextField) c;
                field.setText("");
            }
        }
        //terminou de limpar os campos
        //agora verifica se o está selecionado como inativo o ultimo cadastro aberto e limpa se estiver       
        if (EdtInativo.isSelected()) {
            EdtInativo.setSelected(false);
        }
        inativoCheck();
        String StrSql = "Select max(codpro+1) as codigo from cadpro;";
        try {
            Class.forName("com.mysql.jdbc.Driver");

            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/upinfo", "root", "senha1");
            con.setAutoCommit(false);
            PreparedStatement stmt = con.prepareStatement(StrSql);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                EdtCodigo.setText(rs.getString("codigo"));

            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } catch (SQLException ex) {
            Logger.getLogger(cadastroProduto.class.getName()).log(Level.SEVERE, null, ex);
        }

        EdtCodigo.requestFocus();


    }