Botões Proximo, Anterior

11 respostas
trentinrossi

Boa noite pessoal.

Estou desenvolvendo um aplicativo desktop em Java e gostaria de saber como vocês fazem para implementar o código dos botões primeiro, anterior, próximo, ultimo. Consegui fazer o código dos botões primeiro e ultimo, mas os outros não esta funcionando. Estou usando o exemplo da apostila CALEUM fj21 (é para WEB mas estou usando a parte do banco somente como exemplo). Tambem gostaria de saber se está correto minha implementação em MVC, estou ainda no primeiro ano da faculdade, quase nem falamos muito deste assunto, mas já quero começar a desenvolver usando este padrão. Qual a melhor forma de implementar isso em MVC?? Tem vários exemplos na net mas gostaria da opinião de vocês. Segue código:

PACOTE: MODELO

public class Item {
    private int CodIte;
    private String DesIte;
    private int PesIte;

getters e setters padrao….
}

PACOTE: DAO

public class Dao {
    private Connection conexao;
    private ResultSet rs;
    Item item;
    List<Item> itens = new ArrayList<Item>();

    public static Connection getConnection() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conectado a MySql");
            return DriverManager.getConnection("jdbc:mysql://localhost/javaponto", "root", "sa");
        } catch (ClassNotFoundException e) {
            throw new SQLDataException(e.getMessage());
        }
    }

    public Dao() throws SQLException {
        this.conexao = getConnection();
    }
// BOTAO PRIMEIRO
public List<Item> consultaPrimeiroItem() throws SQLException {
        String sql = "SELECT * FROM CADITE";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        rs = stmt.executeQuery();

        List<Item> menorItem = new ArrayList<Item>();

        rs.first();
        Item item = new Item();
        item.setCodIte(rs.getInt("CODITE"));
        item.setDesIte(rs.getString("DesIte"));
        item.setPesIte(rs.getInt("PesIte"));

        menorItem.add(item);
        rs.close();
        stmt.close();

        return menorItem;
    }
PACOTE VISAO:
private void jbAnteriorActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            Dao dao = new Dao();
            List<Item> itens = dao.consultaAnteriorItem();
            if (itens.size() > 0) {
                for (Item item : itens) {
                    jtfCodIte.setText(String.valueOf(item.getCodIte()));
                    jtfDesIte.setText(item.getDesIte());
                    jtfPesIte.setText(String.valueOf(item.getPesIte()));
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(CadastroItens.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

ESTA GERANDO O SEGUINTE ERRO:
10/08/2009 20:51:37 view.CadastroItens jbAnteriorActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2593)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2734)

11 Respostas

emmanuelrock

Cara opite por usar um JTable para a navegação, por que essa parada de botões põe a usabilidade do seu sistema lá embaixo…

trentinrossi

Boa idéia, não tinha pensado nisso, vou começar a usar, se tiver algum problema posto aqui.

trentinrossi

Algum exemplo de JTable?

Nao to conseguindo fazer… como faço pra passa isso atravez de métodos, ou seja, tenho o pacote DAO com a classe consulta:

public String[] consulta() throws SQLException {
        final DefaultTableModel modelo = new DefaultTableModel();
        JTable tabela = new JTable(modelo);
        String sql = "SELECT * FROM CADITE";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        rs = stmt.executeQuery();
        

        while (rs.next()) {
            
            Integer CodIte = rs.getInt("CodIte");
            String DesIte = rs.getString("DesIte");
            Integer PesIte = rs.getInt("PesIte");
            
            modelo.addRow(new Object[]{new Integer(CodIte), DesIte, new Integer(PesIte)});
        }
        return str;

        rs.close();
        stmt.close();

    }

E tenho o paco te VIEW com a tela no botao consulta:

private void jbNovoActionPerformed(java.awt.event.ActionEvent evt) {
        Item it = new Item();
        String[] vetorItem = new String[3];
        try {
            vetorItem = dao.consulta();

        } catch (SQLException ex) {
            Logger.getLogger(CadastroItens.class.getName()).log(Level.SEVERE, null, ex);
        }
        vetorItem[0] = String.valueOf(it.getCodIte());
        vetorItem[1] = it.getDesIte();
        vetorItem[2] = String.valueOf(it.getPesIte());
        modeloTabela.addRow(vetorItem);
    }

Como faço isso? Como será passado os parametros? List? Array? preciso passa uma coleçao de objetos e nao sei como, ja tentei o List mas nao consegui, tem um exemplo ai?

emmanuelrock

Veja abaixo:

emmanuelrock

Crie uma classe TableUtil e jogue esse método dentro:

public static void toGrid(JTable grid, String query) {

        grid.setCellSelectionEnabled(false);
        grid.setColumnSelectionAllowed(false);
        grid.setDragEnabled(false);
        grid.setRowSelectionAllowed(true);

        try {
            sqlConn = sqlConn.getInstancia();
            sqlConn.connect();
            stmt = sqlConn.setPreparedStatement(query);
            ResultSet rs = stmt.executeQuery();
            if (rs != null) {
                ResultSetMetaData metaData = rs.getMetaData();
                int colCount = metaData.getColumnCount();
                Vector cols = new Vector();
                Vector colSize = new Vector();
                for (int column = 0; column < colCount; column++) {
                    cols.addElement(metaData.getColumnLabel(column + 1));
                    colSize.addElement(metaData.getColumnDisplaySize(column + 1));
                }
                Vector lines = new Vector();
                while (rs.next()) {
                    Vector regs = new Vector();
                    for (int i = 1; i <= metaData.getColumnCount(); i++) {
                        regs.addElement(rs.getObject(i));
                    }
                    lines.addElement(regs);
                }
                grid.setModel(new DefaultTableModel(lines, cols));
                for (int i = 0; i < colCount - 1; i++) {
                    grid.getColumnModel().getColumn(i).setPreferredWidth(
                            Integer.parseInt(colSize.get(i).toString()) * 3);
                }

            }
        } catch (SQLException ex) {
            sqlConn.rollback();
            ex.printStackTrace();
        } finally {
            try {                
                stmt.close();
                sqlConn.disconnected();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

Classe Metadata:

package util;

import banco.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;

public class MetaData {

    private static PreparedStatement stmt;
    private static Conexao sqlConn = null;
    private static ResultSet rs;

    public static Vector tableMetaData(String tableName) {
        Vector lines = new Vector();
        try {
            sqlConn = sqlConn.getInstancia();
            sqlConn.connect();
            stmt = sqlConn.setPreparedStatement("select * from " + tableName);
            rs = stmt.executeQuery();
            ResultSetMetaData rsmt = rs.getMetaData();
            int colCount = rsmt.getColumnCount();
            while (rs.next()) {
                Vector regs = new Vector();
                for (int i = 1; i <= rsmt.getColumnCount(); i++) {
                    regs.addElement(rs.getObject(i));
                }
                lines.addElement(regs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                stmt.close();
                sqlConn.disconnected();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return lines;
    }
}

Faça algumas adptações para o seu caso. Mas é o seguinte, da view você chama esse método e passa a sua JTable e a consulta, e pronto, sua JTable é preenchida.

Abraço…

trentinrossi

Ok, vou fazer desta maneira e retornarei os resultados.

Obrigado!

pedromuyala

trentinrossi:
Boa noite pessoal.

Estou desenvolvendo um aplicativo desktop em Java e gostaria de saber como vocês fazem para implementar o código dos botões primeiro, anterior, próximo, ultimo. Consegui fazer o código dos botões primeiro e ultimo, mas os outros não esta funcionando. Estou usando o exemplo da apostila CALEUM fj21 (é para WEB mas estou usando a parte do banco somente como exemplo). Tambem gostaria de saber se está correto minha implementação em MVC, estou ainda no primeiro ano da faculdade, quase nem falamos muito deste assunto, mas já quero começar a desenvolver usando este padrão. Qual a melhor forma de implementar isso em MVC?? Tem vários exemplos na net mas gostaria da opinião de vocês.

Olha um bom material de estudo sobre MVC está neste link: http://www.guj.com.br/posts/list/129277.java
Vou adicionar este tópico como referência na lista de links sobre MVC que estão na primeira postagem do link que passei. Espero ter colaborado! :wink:

laudenpower

Usar JTable sem quebrar a cabeça??? Use o ObjectTableModel do MarkWeb, procure por ele aqui no fórum e veja lá no blog dele o tutorial.

ViniGodoy

Não é à toa que o link do ObjectTableModel está aqui na minha assinatura.

laudenpower

Na verdade eu ia dizer para procurar por algum dos teus posts e clicar no link ehehehehehe mas achei que tu não ia gostar da idéia :slight_smile:

fabio_kaspar

Olá pessoal, estou com um problema. No meu programa de cadastro estou querendo navegar entre os registros de uma tabela utilizando botões, porém estou com muita dificuldade. Com o JOptionPane ele move os registros, porém se eu tirar ele, o cursor pára no primeiro registro e não é isso que eu queria. Eu queria avançar os registros conforme eu clicar no botão “proximo”. Vou postar o meu código aqui e aguardo a opinião de vocês. Muito obrigado desde já.

public class BtnProxActionListener implements ActionListener {
    	        	  public void actionPerformed(ActionEvent e) {
    	        		  String url = "jdbc:mysql://127.0.0.1/javabd2";
    				      String usuario = "root";
    				      String senha = null;
    				      Connection conx;
    	
						try {
							conx = DriverManager.getConnection(url, usuario, senha);
							 stt = conx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
		                               ResultSet.CONCUR_UPDATABLE);
		                       ResultSet nx = stt.executeQuery("SELECT * FROM cliente"); 
		                   while(nx != null){
		                	      JOptionPane.showMessageDialog(null, "próximo registro");
                                nx.next();
	     	                    txtNmCl.setText(nx.getString("cl_nome"));
	     	           			txtRgCl.setText(nx.getString("cl_rg"));
	     	           			txtCpfCl.setText(nx.getString("cl_cpf"));
	     	           			txtTelCl.setText(nx.getString("cl_tel"));
	     	           			txtEndCl.setText(nx.getString("cl_end"));
	     	         
                           
		                   }
		                   stt.close();
		                   
    	               }catch(SQLException e1){
    	            		e1.printStackTrace();
    	        }
    	           
            }
    	 }
Criado 10 de agosto de 2009
Ultima resposta 29 de jul. de 2010
Respostas 11
Participantes 6