Inserir Linha em branco no Jtablemodel

3 respostas
C

Olá Pessoal...ainda sou meio novato no swing e já estou a algum tempo tentando encontrar uma solução para o meu TableModel, ja vi varios exemplos aqui no forum mas nenhum onde o TableModel nao utiliza array list para instanciar a tabela como no meu caso, e assim nao consigo fazer o metodo addrow rodar..se alguem tiver alguma ideia do que possa ser mande ai

ta aqui a minha classe JTableModel:

import javax.swing.table.*;
import java.sql.*;

public class Tabela extends AbstractTableModel {
	private Connection conexao;
	private Statement statement;
	private ResultSet resultSet;
	private ResultSetMetaData metaData;
	private int linhas;
	private String query;
	
	public Tabela(String driver, String url, String user, 
			String password, String query) 
	throws SQLException, ClassNotFoundException {
		Class.forName(driver);
		conexao = DriverManager.getConnection(url, user, password);
		statement = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_READ_ONLY);
		setQuery(query);
	}
	
	// Retorna a classe que representa o tipo da coluna
	public Class getColumnClass(int column) {
		try {
			String className = metaData.getColumnClassName(column + 1);
			return Class.forName(className);
		}
		catch (Exception exception) {
			exception.printStackTrace();
		}
		// Se ocorrer algum problema, assume o tipo Object
		return Object.class;
	}
	
	public int getColumnCount() {
		try {
			return metaData.getColumnCount();
		}
		catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		// Se ocorrer algum problema, retorna 0 como número de colunas
		return 0;
	}
	
	public String getColumnName(int column) {
		try {
			return metaData.getColumnLabel(column + 1);
		}
		catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		// Se ocorrer algum problema, retorna uma string vazia
		return "";
	}
	
	protected void finalize() {
		try {
			statement.close();
			conexao.close();
		}
		catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}		
	}
	
	public int getRowCount() {
		return linhas;
	}
	
	public Object getValueAt(int row, int column) {
		try {
			resultSet.absolute(row + 1);
			
			return resultSet.getObject(column + 1);
		}
		catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return "";
	}

	public void refresh() throws SQLException {
		setQuery(query);
	}
	
	public void setQuery(String qry) throws SQLException {
		query = qry;
		resultSet = statement.executeQuery(qry);
		metaData = resultSet.getMetaData();
		
		// determina o número de linhas em um resultSet
		resultSet.last();
		linhas = resultSet.getRow();
		
		//notifica JTable das alterações
		fireTableStructureChanged();
	}
	
		public void addRow(){
			System.out.println(linhas);
			fireTableRowsInserted(linhas-1, linhas-1);
		}
		

}

Desde já agradeço pela força galera. :D

3 Respostas

Marky.Vasconcelos

Sua implementação de TableModel não devia ser responsavel por trazer os dados do banco, seu DAO deveria fazer isso e levar só a List para seu Model, desse modo, para adicionar uma nova linha seria apenas adicionar um novo Objeto nessa lista.

cardosao

Ola, boa noite.

Completando o que o amigo acima falou, sempre separe suas classes em seus respectivos pacotes (DAO, entity, view e etc), assim fica mais claro e voce pode reutilizar classes e utilizar funcionalidades como herança entre outras…

caso tenha duvida na criação da classe de acesso ao BD, posso te ajudar.

C

Olá novamente pessoal... desculpe pela demora, mas acabei tendo uns problemas nesses ultimos dias..
marky e cardosao obrigado pelas dicas, eu estou seguindo elas e andei refazendo a minha tablemodel...
eu achei aqui no forum um exemplo bacana do vini.godoy e implementei a minha e consegui fazer rodar,mas agora estou
enfrentando o seguinte problema.. meu modelo esta trazendo apenas um objeto do select que eu faço, será que alguem
teria alguma ideia do que possa ser ?

Vou mostrar como estao minhas classes...

Na minha classe da tela existe o seguinte metodo:

public TabFaseDAO buscar(TabFaseDAO fase){
		String sql = "SELECT * FROM FASEPROCESSO ORDER BY NUMFASE";
		try {   
	        ResultSet rs = conexao.setExeQuery(sql);  
	        while(rs.next()) {   
	            fase.setIdfase(rs.getString(1));   
	            fase.setNumFase(rs.getString(2));   
	            fase.setData(rs.getString(3));  
	            fase.setLocalizacao(rs.getString(4));
	            fase.setObs(rs.getString(5));
	            fase.setIdproc(rs.getString(6));
	            results.addElement(fase);  
	        }   
            tabelaproc=new TabelaProc(results);
            jTable1.setModel(tabelaproc);
            jTable1.repaint();
            
	        rs.close();     
	        return fase;   
	       
	    }catch (SQLException e) {   
	        throw new RuntimeException(e);   
	    }
	    

	}

e o objeto desse método é minha classe DAO da tabela:

public class TabFaseDAO {

	Conexao conexao = null;
	private String idfase;
	private String NumFase;
	private String data;
	private String localizacao;
	private String obs;
	private String idproc;
	
	
	
	public String getIdfase() {
		return idfase;
	}

	public void setIdfase(String idfase) {
		this.idfase = idfase;
	}
	
	public String getNumFase() {
		return NumFase;
	}

	public void setNumFase(String numFase) {
		NumFase = numFase;
	}
	
	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getLocalizacao() {
		return localizacao;
	}

	public void setLocalizacao(String localizacao) {
		this.localizacao = localizacao;
	}

	public String getObs() {
		return obs;
	}

	public void setObs(String obs) {
		this.obs = obs;
	}

	public String getIdproc() {
		return idproc;
	}

	public void setIdproc(String idproc) {
		this.idproc = idproc;
	}
	
	//metodos de inserção e updade...
}

e por fim a classe tablemodel que eu implementei:

public class TabelaProc extends AbstractTableModel {   
    private static final int COL_IDFASE = 0;   
    private static final int COL_NUMFASE = 1;
    private static final int COL_DATA = 2;
    private static final int COL_LOCALIZACAO = 3;
    private static final int COL_OBS = 4;
    private static final int COL_IDPROC = 5;
  
    private List<TabFaseDAO> valores;         
  
    //Esse é um construtor, que recebe a nossa lista de livros   
    public TabelaProc(List<TabFaseDAO> valores) {   
          this.valores = new ArrayList<TabFaseDAO>(valores);   
    }   
  
    public int getRowCount() {   
        //Quantas linhas tem sua tabela? Uma para cada item da lista.   
        return valores.size();   
    }   
  
    public int getColumnCount() {   
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.   
        return 6;   
    }   
  
    public String getColumnName(int column) {   
        //Qual é o nome das nossas colunas?   
        if (column == COL_IDFASE) return "Código";   
        if (column == COL_NUMFASE) return "Numero";
        if (column == COL_DATA) return "Data";
        if (column == COL_LOCALIZACAO) return "Localização";
        if (column == COL_OBS) return "Obs";
        if (column == COL_IDPROC) return "Processo";
        
        return ""; //Nunca deve ocorrer   
    }   
  
    public Object getValueAt(int row, int column) {   
        //Precisamos retornar o valor da coluna column e da linha row.   
    	TabFaseDAO codigo = valores.get(row);   
        if (column == COL_IDFASE) return codigo.getIdfase();   
        else if (column == COL_NUMFASE) return codigo.getNumFase();
        else if (column == COL_DATA) return codigo.getData();
        else if (column == COL_LOCALIZACAO) return codigo.getLocalizacao();
        else if (column == COL_OBS) return codigo.getObs();
        else if (column == COL_IDPROC) return codigo.getIdproc(); 
        return ""; //Nunca deve ocorrer   
    }   
  
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {   
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.   
        //Note que vc poderia alterar 2 campos ao invés de um só.   
        TabFaseDAO objeto = null;
    	if (columnIndex== COL_IDFASE) objeto.setIdfase(aValue.toString());   
        else if (columnIndex== COL_NUMFASE) objeto.setNumFase(aValue.toString());    
        else if (columnIndex== COL_DATA) objeto.setData(aValue.toString());
        else if (columnIndex== COL_LOCALIZACAO) objeto.setLocalizacao(aValue.toString());
        else if (columnIndex== COL_OBS) objeto.setObs(aValue.toString());
        else if (columnIndex== COL_IDPROC) objeto.setIdproc(aValue.toString()); 
    }   
  
    public Class<?> getColumnClass(int columnIndex) {   
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.   
        return String.class;   
    }   
       
    public boolean isCellEditable(int rowIndex, int columnIndex) {   
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.   
        return false;   
    }   
    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.   
    //Isso elimina a necessidade de chamar o getValueAt() nas telas.   
    public TabFaseDAO get(int row) {   
        return valores.get(row);   
    }   
    
    public void add(TabFaseDAO fase) {   
    	  valores.add(fase);   
    	  fireTableRowsInserted(valores.size()-1, valores.size()-1);   
    	}  

}

Obrigado mais uma vez pessoal..

Criado 16 de março de 2011
Ultima resposta 21 de mar. de 2011
Respostas 3
Participantes 3