Consulta em bd postgre, ajuda

eu tenho uma tabela clientes aonde eu precisava fazer uma consulta que me retornasse todos clientes
mas o problema é
que eu preciso fazer tipo um navegador com dois botoes um proximo e um anterior para navegar pelos clientes dessa tabela

eu precisava de alguma ideia para fazer isso

mas em que voce vai desenvolver isso, web, client? porque existe muitas formas de voce fazer isso, mas precisamos de mais detalhes

é uma aplicação desktop e vou usar swing

Basta criar um painel com dois botões e criar uma iteração entre eles.

da um erro
Exception in thread “main” java.lang.NullPointerException
at teste.(teste.java:49)
at teste.main(teste.java:234)

e eu não sei aonde é alguem pode ajudar?

o código é esse

public class teste extends JFrame{

	public static String codigo;
	public static String nome;
	public static ResultSet rs;
	private AbstractButton tf;
	private AbstractButton tf1;
	
	teste(){
		
		try{ 

		       Class.forName("org.postgresql.Driver");



		       Connection con=DriverManager.getConnection("jbdc:postgresql://localhost:5432/teste","postgres","postgres");

		       Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

		      ResultSet rs= stmt.executeQuery("Select * from clientes");
		       if(rs.first()){
		    	   tf.setText(rs.getString("codigo"));  
                   tf1.setText(rs.getString("nome"));  
                    
		       }
		            
		       
				} catch(SQLException e){ //trata os erros

		            JOptionPane.showMessageDialog(null,"Erro Cmdo SQL " + e.getMessage());

		       } catch(ClassNotFoundException e){    

		           JOptionPane.showMessageDialog(null,"Driver não encontrado");

		       }       
	
		setTitle("Clientes");
		setBounds(100,100,600,400);
		setLayout(null);

		JLabel l1=new JLabel("Código");
		l1.setBounds(10, 10, 100, 30);
		getContentPane().add(l1);
		
		
		final JTextField tf=new JTextField();
		tf.setBounds(100, 10, 150, 30);
		getContentPane().add(tf);
		
	
		JLabel l2=new JLabel("Nome");
		l2.setBounds(10, 40, 100, 30);
		getContentPane().add(l2);
		
		
		final JTextField tf1=new JTextField();
		tf1.setBounds(100, 40, 150, 30);
		getContentPane().add(tf1);
		
		
		
		
		
		
		
		
		JButton btn=new JButton("Primeiro");
		btn.setBounds(0, 230, 100, 30);
		getContentPane().add(btn);
		btn.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent f){
						try{

					        rs.first();

					        tf.setText(rs.getString("codigo"));

					        tf1.setText(rs.getString("nome"));

					     } catch(SQLException e){ //trata os erros

					        JOptionPane.showMessageDialog(null,"Primeiro");       

					    }					
					}
				}
			);
		
		
		JButton btn1=new JButton("Anterior");
		btn1.setBounds(100, 230, 100, 30);
		getContentPane().add(btn1);
		btn1.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent f){
						try{

					        rs.previous();

					        tf.setText(rs.getString("codigo"));

					        tf1.setText(rs.getString("nome"));

					   } catch(SQLException e){ //trata os erros

					 JOptionPane.showMessageDialog(null,"Não Existem mais Registros");

					 }        						
					}
				}
			);
		
		JButton btn2=new JButton("Próximo");
		btn2.setBounds(200, 230, 100, 30);
		getContentPane().add(btn2);
		btn2.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent f){
						try{

					        rs.next();

					        tf.setText(rs.getString("codigo"));

					        tf1.setText(rs.getString("nome"));

					      } catch(SQLException e){ //trata os erros

					JOptionPane.showMessageDialog(null,"Não Existem mais Registros");

					      }					
					}
				}
			);
		
		
		JButton btn3=new JButton("Ultimo");
		btn3.setBounds(300, 230, 100, 30);
		getContentPane().add(btn3);
		btn3.addActionListener(
				new ActionListener(){
					public void actionPerformed(ActionEvent f){
						try{

					        rs.last();

					        tf.setText(rs.getString("codigo"));

					        tf1.setText(rs.getString("nome"));

					           } catch(SQLException e){ //trata os erros

					  JOptionPane.showMessageDialog(null,"Ultimo");

					           }        					
					}
				}
			);
		
		
		
		
		
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
}

[quote=felipemlopes]da um erro
Exception in thread “main” java.lang.NullPointerException
at teste.(teste.java:49)
at teste.main(teste.java:234)

e eu não sei aonde é alguem pode ajudar?
[/quote]

Linha 49, NullPointerException.
Não é essa a linha?

O teu tf está nulo.