Inserir Linha em branco no Jtablemodel

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:

[code]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);
	}

}[/code]

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

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.

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.

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:

[code]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);   
    }
    

}[/code]

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

[code]
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...

}[/code]

e por fim a classe tablemodel que eu implementei:

[code]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);   
	}  

} [/code]

Obrigado mais uma vez pessoal…