Duvida JTable [RESOLVIDO]

Bom dia, eu li um artigo para criar um modelo próprio de JTable, eu consegui mostrar os dados mas, os “Headers” não aparecem. Alguém pode me dizer o que fiz de errado?

Código do Modelo:

package utilitarios;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class AcessoTModel extends AbstractTableModel{

	private ArrayList linhas = null;
	private String[] colunas = null;
	
	public String[] getColunas(){
		return colunas;
	}
	
	public ArrayList getLinhas(){
		return linhas;
	}
	
	public void setColunas(String[] strings){
		colunas = strings;
	}
	
	public void setLinhas(ArrayList list){
		linhas = list;
	}
	
	
	public int getColumnCount() {
		return getColunas().length;
	}

	public int getRowCount() {
		return getLinhas().size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		 String [] linha = (String [])getLinhas().get(rowIndex);    
		    return linha[columnIndex];  
	}

	public AcessoTModel(ArrayList dados, String[] colunas){  
	    setLinhas(dados);  
	    setColunas(colunas);  
	}
	
	public String getColumnName(int col){  
	    return getColunas()[col];  
	}  
}

Código da JTable:

//JTable
		 ArrayList dados = new ArrayList();  
		 String[] colunas = new String[] { "Id", "Usuario", "Senha", "Acesso" };  
		  
		 try
	     {
			 con_login.r.beforeFirst();
	            while (con_login.r.next())
	            {
	                    dados.add(new String[]{con_login.r.getString("idlogin"),
	                    con_login.r.getString("logaccount"), 
	                    con_login.r.getString("logpassword"),
	                    con_login.r.getString("acesso")});
	            }
	            con_login.r.first();
	     }
	     catch (SQLException erro)
	     {
	    	 JOptionPane.showMessageDialog(null, "Não foi possivel informar os dados "+erro);
	     } 
		  
		 AcessoTModel modelo = new AcessoTModel(dados, colunas);
		 modelo.getColumnName(3);
		 
		 
		tableAcesso = new JTable(modelo);
		tableAcesso.setBounds(270, 75, 214, 247);
		contentPane.add(tableAcesso);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

Obrigado

Faltou utilizar os dados da coluna:

String[] colunas = new String[] { "Id", "Usuario", "Senha", "Acesso" }; 

Segue o exemplo do link http://www.guj.com.br/articles/140


    String[][] dados = new String [][]{  
                  {"SP","Sao Paulo"},  
                  {"RJ","Rio de Janeiro"},  
                  {"RN","Rio Grande do Norte"},  
                  {"PR","Parana"}  
    };  
    String[] colunas = new String []{"Estado","Cidade"};  
    // Ao inves de passar direto, colocamos os dados em um modelo  
    DefaultTableModel modelo = new DefaultTableModel(dados, colunas);  
    // e passamos o modelo para criar a jtable  
    JTable jtable = new JTable( modelo );  

Se voce implementar no seu TableModel o meotodo getColumnName(int column) ira funcionar


@Override
public String getColumnName(int column)
{
    return colunas[column];
}

Ve se funciona, concerteza ira funcionar ate mais

Eu coloquei os dados no arraylist como está aqui:

try  
         {  
             con_login.r.beforeFirst();  
                while (con_login.r.next())  
                {  
                        dados.add(new String[]{con_login.r.getString("idlogin"),  
                        con_login.r.getString("logaccount"),   
                        con_login.r.getString("logpassword"),  
                        con_login.r.getString("acesso")});  
                }  
                con_login.r.first();  
         }  
         catch (SQLException erro)  
         {  
             JOptionPane.showMessageDialog(null, "Não foi possivel informar os dados "+erro);  
         }       

E o método “getColumnName” já está no Table Model

public String getColumnName(int col){    
        return getColunas()[col];    
    } 

Minha pergunta é como eu devo chamar no frame o método getColumnName e que valor inteiro colocar no parâmetro para ele funcionar?
Obrigado.

lucaslzl, fiz o teste aqui com seu código e foi apresentado o header da JTable, só tive que adicionar a linha:

JScrollPane jscrollPane = new JScrollPane(tableAcesso);

Ficou assim:

JFrame f = new JFrame();
ArrayList dados = new ArrayList();    
String[] colunas = new String[] { "Id", "Usuario", "Senha", "Acesso" };  
dados.add("1 - Id");
dados.add("1 - Usuario");
dados.add("1 - Senha");
dados.add("1 - Acesso");

AcessoTModel modelo = new AcessoTModel(dados, colunas);  
//modelo.getColumnName(3);  
          
          
JTable tableAcesso = new JTable(modelo);  
JScrollPane jscrollPane = new JScrollPane(tableAcesso);
tableAcesso.setBounds(270, 75, 214, 247);  
f.getContentPane().add(jscrollPane);  
tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
f.setSize(400, 400);
f.setVisible(true);

Os dados não foram apresentados na JTable, só valide o header.

Voce não chama o metodo, ele é chamado automaticamente para voce se voce tiver feito ele corretamente estara funcionando, voce naum chama esse metodo, faz o seguinte posta o codigo inteiro das classe para dar uma olhada

dá uma olhada isso
staticjava.blogspot.com.br

Classe acesso:

import java.awt.EventQueue;

public class Acesso extends JFrame {

	private JPanel contentPane;
	private JTextField tfUsuario;
	private JTextField tfSenha;
	private JTextField tfAcesso;
	private JTable tableAcesso;
	
	Connect con_login;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Acesso frame = new Acesso();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Acesso() {
		
		//Cria um objeto de conexão e conecta com a tabela de login
		con_login = new Connect(); 
		con_login.conecta();
		con_login.executeSQL("select * from login order by idlogin");
		        
		//Cria o form e coloca tamanho
		setTitle("Cadastro de contas");
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 500, 400);
		setLocationRelativeTo(null);
		
		//Cria o panel do form
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		//Cria o panel de cima
		JPanel panelUp = new JPanel();
		panelUp.setBounds(0, 0, 494, 39);
		panelUp.setBackground(new Color(70, 130, 180));
		contentPane.add(panelUp);
		
		//Cria o panel de baixo
		JPanel panelDown = new JPanel();
		panelDown.setBounds(0, 333, 494, 39);
		panelDown.setBackground(new Color(70, 130, 180));
		contentPane.add(panelDown);
		
		//Label do usuario
		JLabel lblUsuario = new JLabel("Usuario:");
		lblUsuario.setFont(new Font("Arial", Font.PLAIN, 14));
		lblUsuario.setBounds(45, 75, 54, 14);
		contentPane.add(lblUsuario);
		
		//Label da senha
		JLabel lblSenha = new JLabel("Senha:");
		lblSenha.setFont(new Font("Arial", Font.PLAIN, 14));
		lblSenha.setBounds(45, 121, 46, 14);
		contentPane.add(lblSenha);
		
		//Label do acesso
		JLabel lblNvAcesso = new JLabel("N\u00EDvel de acesso:");
		lblNvAcesso.setFont(new Font("Arial", Font.PLAIN, 14));
		lblNvAcesso.setBounds(45, 166, 116, 14);
		contentPane.add(lblNvAcesso);
		
		//tf do usuario
		tfUsuario = new JTextField();
		tfUsuario.setFont(new Font("Arial", Font.PLAIN, 14));
		tfUsuario.setBounds(45, 90, 156, 20);
		contentPane.add(tfUsuario);
		tfUsuario.setColumns(10);
		
		//tf da senha
		tfSenha = new JTextField();
		tfSenha.setFont(new Font("Arial", Font.PLAIN, 14));
		tfSenha.setBounds(45, 135, 156, 20);
		contentPane.add(tfSenha);
		tfSenha.setColumns(10);
		
		//tf do acesso
		tfAcesso = new JTextField();
		tfAcesso.setFont(new Font("Arial", Font.PLAIN, 14));
		tfAcesso.setBounds(45, 182, 96, 20);
		contentPane.add(tfAcesso);
		tfAcesso.setColumns(10);
		
		//botão para cadastrar
		JButton btnCadastrar = new JButton("Completar Cadastro");
		btnCadastrar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int cont = 1;
				try
		        {
					con_login.r.last();
						cont = con_login.r.getInt("idlogin");
						cont++;
		            String sqlinsert = "insert into login (idlogin, logaccount, logpassword, acesso) values ('"+
		                    cont+"','"+
		                    tfUsuario.getText()+"','"+
		                    tfSenha.getText()+"','"+
		                    tfAcesso.getText()+"')";
		            con_login.s.executeUpdate(sqlinsert);
		            JOptionPane.showMessageDialog(null, "Gravação realizada com sucesso");
		            
		            con_login.r = con_login.s.executeQuery("Select * from login");
		            con_login.r.beforeFirst();
		        }
		        catch(SQLException erro)
		        {
		            JOptionPane.showMessageDialog(null, "Erro ao gravar dados "+erro);
		        }
			}
		});
		btnCadastrar.setIcon(new ImageIcon("D:\\TCC - Leak Software\\Leak\\Leak\\src\\icons\\1341608046_save_24.png"));
		btnCadastrar.setFont(new Font("Arial", Font.PLAIN, 12));
		btnCadastrar.setBounds(38, 233, 184, 39);
		contentPane.add(btnCadastrar);		
		
		//JTable
		 ArrayList<String[]> dados = new ArrayList<String[]>();  
		 String[] colunas = new String[] { "Id", "Usuario", "Senha", "Acesso" };  
		  
		 try
	     {
			 con_login.r.beforeFirst();
	            while (con_login.r.next())
	            {
	                    dados.add(new String[]{con_login.r.getString("idlogin"),
	                    con_login.r.getString("logaccount"), 
	                    con_login.r.getString("logpassword"),
	                    con_login.r.getString("acesso")});
	            }
	            con_login.r.first();
	     }
	     catch (SQLException erro)
	     {
	    	 JOptionPane.showMessageDialog(null, "Não foi possivel informar os dados "+erro);
	     } 
		  
		 JScrollPane jscrollPane = new JScrollPane(tableAcesso);  
		 contentPane.add(jscrollPane);
		 
		 AcessoTModel modelo = new AcessoTModel(dados, colunas);
		 
		tableAcesso = new JTable(modelo);
		tableAcesso.setBounds(232, 75, 252, 214);
		contentPane.add(tableAcesso);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
	}
}

Código do modelo:

package utilitarios;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class AcessoTModel extends AbstractTableModel{

	private ArrayList linhas = null;
	private String[] colunas = null;
	
	public String[] getColunas(){
		return colunas;
	}
	
	public ArrayList getLinhas(){
		return linhas;
	}
	
	public void setColunas(String[] strings){
		colunas = strings;
	}
	
	public void setLinhas(ArrayList list){
		linhas = list;
	}
	
	
	public int getColumnCount() {
		return getColunas().length;
	}

	public int getRowCount() {
		return getLinhas().size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		 String [] linha = (String [])getLinhas().get(rowIndex);    
		    return linha[columnIndex];  
	}

	public AcessoTModel(ArrayList dados, String[] colunas){  
	    setLinhas(dados);  
	    setColunas(colunas);  
	}
	
	public String getColumnName(int column)  
	{  
	    return getColunas()[column];  
	}   
}

Pelo que vi me parece certo, deveria funcionar

É isso que aparece quando eu executo o programa.

http://img844.imageshack.us/img844/6197/semttulokfm.png

Lucas,

Tente fazer o seguinte:

Na classe Acesso, da linha 157 a 165, coloque o código abaixo:

        AcessoTModel modelo = new AcessoTModel(dados, colunas);                
        tableAcesso = new JTable(modelo);    
        JScrollPane jscrollPane = new JScrollPane(tableAcesso);      
        jscrollPane.setBounds(232, 75, 252, 214);    
        contentPane.add(jscrollPane);
        tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

Alterei a mensagem anterior, o código que está agora deve funcionar.

Ficou assim:

 AcessoTModel modelo = new AcessoTModel(dados, colunas);
		 
		tableAcesso = new JTable(modelo);
		tableAcesso.setBounds(232, 75, 252, 221);
		JScrollPane jscrollPane = new JScrollPane(tableAcesso);
		contentPane.add(jscrollPane);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
		contentPane.add(tableAcesso);

Mas ainda não funcionou :/. E quando coloco o setBounds do jscrollPane ele fica encima do JTable, e se eu coloco fora ele não funciona.
E ainda estou com o problema agora são os headers.

Os headers de uma JTable só aparecem se ela estiver dentro de um JScrollPane. O problema não está no seu TableModel.

PS: Quando recomendamos que você use um TableModel próprio, falamos para construir um TableModel da sua classe de negócio.
Ou seja, no seu caso, um objeto UsuarioTableModel, com um List dentro.

Fazer um TableModel de uma lista de String[] é uma solução parecida com o que o DefaultTableModel já faz.
Com essa solução você terá os mesmos problemas e fará as mesmas gambiarras que já faria com o Default.

Entendi ViniGodoy, mas o que teria nessa List?

E, só por desencargo de consciência tem algo de errado nessa parte do código:

 AcessoTModel modelo = new AcessoTModel(dados, colunas);
		 
		tableAcesso = new JTable(modelo);
		tableAcesso.setBounds(232, 75, 252, 221);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		JScrollPane jscrollPane = new JScrollPane(tableAcesso);  
		contentPane.add(jscrollPane);  
		contentPane.add(tableAcesso);

Você não criou uma classe Usuario e um DAO para carregar os usuários do banco?

Essa lista teria o retorno desse dao.

Retire a linha 08. Você não deve adicionar o JTable diretamente no contentpane. Só o scrollpane é adicionado.

Você teria algum material de DAO e List para eu estudar?

[quote=lucaslzl]Ficou assim:

 AcessoTModel modelo = new AcessoTModel(dados, colunas);
		 
		tableAcesso = new JTable(modelo);
		tableAcesso.setBounds(232, 75, 252, 221);
		JScrollPane jscrollPane = new JScrollPane(tableAcesso);
		contentPane.add(jscrollPane);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
		contentPane.add(tableAcesso);

Mas ainda não funcionou :/. E quando coloco o setBounds do jscrollPane ele fica encima do JTable, e se eu coloco fora ele não funciona.
E ainda estou com o problema agora são os headers.[/quote]

Lucas,

Você tentou fazer o que sugeri? Eu rodei aqui e funcionou.

O jscrollPane fica em cima do JTable porque você está adicionando o JTable ao contentPane sem necessidade. Só precisa adicionar o jscrollPane. O Viny Godoy falou isso também.
E não precisa chamar o setBounds do JTable.

Sim, agora funcionou. Eu não estava usando “setBounds” no jscrollPane, coloquei o “setBouns” do JTable no jscrollPane e funcionou perfeitamente. Obrigado.
Ficou assim:

 tableAcesso = new JTable(modelo);
		tableAcesso.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		JScrollPane jscrollPane = new JScrollPane(tableAcesso);  
		jscrollPane.setBounds(232, 75, 252, 221);
		contentPane.add(jscrollPane); 

Agora preciso melhorar o modelo, portanto gostaria de saber se alguém tem algum material bom de estudo para aprender DAO e List?

Agradeço.