Jtable java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.String;

Boa tarde, estou com um problema para puxar do bd e jogar na jtable, estava fazendo tudo isso numa classe só e funcionava perfeitamente, entretanto estou tentando separar o codigo do bd do codigo da interface grafica.

Meu modelo da tabela;

[code]package programa;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class ConsultTableModel extends AbstractTableModel{

private ArrayList linhas = new ArrayList ();  
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);   // o erro aponta pra essa linha
    return linha[columnIndex]; 
}
        
@Override  
public String getColumnName(int col)
{  
   return colunas[col];  
}  


public void addRow( ArrayList dadosLinha)
{  
	
	
	    getLinhas().add(dadosLinha);      	  
	    int linha = getLinhas().size()-1;  
	    fireTableRowsInserted(linha,linha);
	    return;  
}

public void LimpaConsult()
{  

	linhas.clear();
	
	fireTableDataChanged();
			
}

public ConsultTableModel(String[] colunas){  
    
    setColunas(colunas);  
} 

public void AlterarColunas (String[] colunas)
{
	setColunas(colunas);
	fireTableStructureChanged();
}

public void setValueAt(Object OBJValues, int INTRow001, int INTCol001){  
    String [] STGLinhas = (String [])getLinhas().get(INTRow001);  
    STGLinhas[INTCol001] = (String)OBJValues;  
    fireTableCellUpdated(INTRow001,INTCol001);  
    }

public void removeRow(int row){  
    getLinhas().remove(row);         
    fireTableRowsDeleted(row,row);  
} 



	}

[/code]

Classe Consulta

public void actionPerformed(ActionEvent e) {
		if(e.getSource()==BtConsultar)
		{	
			
		    		
		    		if(strTabela=="Computador")
		    		{
		    			
		    			table="Computador";
		    			
		    		
		    		String[] colunas = new String[]{"Nome","Usuario","Setor","Configurações","Proprietário","Observação"};
		    		    		
		    		AddTablePanel(colunas);
		    		modelo.AlterarColunas(colunas);
				modelo.LimpaConsult();
						    		
				jtable.getColumnModel().getColumn(0).setPreferredWidth(100);  
			        jtable.getColumnModel().getColumn(1).setPreferredWidth(100);  
			        jtable.getColumnModel().getColumn(2).setPreferredWidth(175);  
			        jtable.getColumnModel().getColumn(3).setPreferredWidth(220);  
			        jtable.getColumnModel().getColumn(4).setPreferredWidth(90);  
			        jtable.getColumnModel().getColumn(5).setPreferredWidth(250);  
	    			
			    			        
			        ComputadorDB a = new ComputadorDB();
			        
			        
			        modelo.addRow(a.Select("imigrantes"));
		    		
		    		}

Classe onde eu faço o select e retorno o valor para adicionar na jtable.

[code]
public ArrayList Select (String Unidade)
{
ArrayList select = new ArrayList();
Conectar(“select nome,usuario,configuracao,setor,proprietario,observacao from Computador where unidade = ? order by nome” );

	try
	{
		st.setString(1,Unidade);				
		rs=st.executeQuery();
		
	while (rs.next())
	{
		EncapComputador temp = new EncapComputador();
	
                    /*	
		temp.setNome(rs.getString("nome"));
		temp.setUsuario(rs.getString("usuario"));
		temp.setConfiguracao(rs.getString("configuracao"));
		temp.setSetor(rs.getString("setor"));
		temp.setProprietario(rs.getString("proprietario"));
		temp.setObservacao(rs.getString("observacao"));
                   
                  select.add(temp);

EU ESTAVA TENTANDO FAZER DESSA MANEIRA /\ , MAS NAO FUNCIONOU TBM…

		*/
		
		
		
		select.add(rs.getString("nome"));
		select.add(rs.getString("usuario"));
		select.add(rs.getString("configuracao"));
		select.add(rs.getString("setor"));
		select.add(rs.getString("proprietario"));
		select.add(rs.getString("observacao"));
		
	}		
		
	return select;	
		
	} catch (SQLException e)
	{  
         imprimeErro("Erro ao buscar Computador", e.getMessage());  
         return null;  
    }
	
	
   }
[/code]

Alguem pode me ajudar o porque de acontecer esse erro?

[size=9] Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.String;
at programa.ConsultTableModel.getValueAt(ConsultTableModel.java:42)
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)[/size]

o getLinhas retorna um ArrayList, você não pode jogar ele numa array de String (String[])

abs

E como eu posso mudar isso pra corrigir?
se eu nao jogar em um array, qual alteração devia ser feita?
obrigado.

você pode percorrer o ArrayList (através de um for por exemplo) e ir criando o array de String

abs

Cara, desculpe, mas como eu faria isso? :oops:

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

essa seria a parte que deveria ser alterada né?

Como eu faria esse for?

oi,

você pode alterar o método getLinhas para retornar direto um array de String

[code]
List<String> lista = new ArrayList<String>();
lista.add("um");
lista.add("dois");
lista.add("tres");

	int tam = lista.size();
	if (tam &gt; 0) {
		String[] strs = new String[tam + 1];
		for (int i = 0; i &lt; lista.size(); i++) {
			strs[i] = lista.get(i);
		}
	}[/code]

ai no outro método você pode pegar direto pelo indice sem precisar da conversão, entendeu??

Primeiro eu faria esta alteração:

[code]
public String[] getLinhas()
{
String[] strs = null;
int tam = linhas.size();
if (tam > 0) {
strs = new String[tam + 1];
for (int i = 0; i < linhas.size(); i++) {
strs[i] = linhas.get(i);
}
}

	return strs;
}[/code]

E aqui eu nao precisaria transformar array, certo?


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

Mas entao, eu teria que mudar tbm : getRowCount() , getColumnCount(), addRow(), setValueAt(), removeRow(), para trabalhar com array e nao com arraylist ?

oi,

desculpe cara, agora olhei melhor seu código

a chamada

retorna apenas um elemento do ArrayList que no caso é apenas um objeto do tipo String

por isso o erro na hora de converter ele para um array de Strings

E como eu poderia corrigir isso? akela forma que voce falou, se aplica ao meu caso?

Mas quando eu enviava os dados dessa maneira, direto pela classe consulta:


while(rs.next())
{

dados[0] = rs.getString("nome");  
dados[1]  =rs.getString("usuario");  
dados[2] =rs.getString("configuracao");  
dados[3]   =  rs.getString("setor");  
dados[4]  =  rs.getString("proprietario");  
dados[5]    =  rs.getString("observacao"); 



modelo.addRow(dados);
}

Funcionava direitinho, ai quando eu mudei pra adicionar arraylist que começou esse problema.

acho que você pode adicionar direto no array como você está fazendo neste último exemplo, depois quando estiver funcionando você pode refatorar para adicionar em outra estrutura de dados (pode por exemplo criar um arraylist de objetos do seu tipo de dados)

Bom dia,

Cara é o seguinte, dakele jeito que postei acima era o jeito que eu fazia quando o codigo do banco de dados estava junto com da interface grafica, entao eu podia usar o array pq dali eu ja mandava pra tabela, mas eu precisando pegar a consulta de outra classe (ComputadorDB) eu tenho que retornar o valor, e se eu retornar do jeito que eu faço no exemplo acima iria vir só uma linha, por isso eu tinha mudado para o array, para mandar todas as linhas.

Entao eu fiz a seguinte alteração:

[code]
public ArrayList Select (String Unidade)
{
ArrayList select = new ArrayList();
Conectar(“select nome,usuario,configuracao,setor,proprietario,observacao from Computador where unidade = ? order by nome” );

	try
	{
		st.setString(1,Unidade);				
		rs=st.executeQuery();
		
	while (rs.next())
	{			
		String [] dados = new String [6];
		
		
		dados[0]=(rs.getString("nome"));
		dados[1]=(rs.getString("usuario"));
		dados[2]=(rs.getString("configuracao"));
		dados[3]=(rs.getString("setor"));
		dados[4]=(rs.getString("proprietario"));
		dados[5]=(rs.getString("observacao"));
		
		select.add(dados);
		
	}

return select;

}

	[/code]  

Na classe modelo, eu coloquei o seguinte metodo, e funcionou direitinho, mas isso é gambiarra, não?

[code]

public void NovoModel (ArrayList teste)
{
linhas = teste;

}
[/code]

Teria que mudar mais alguma coisa?
Akele esquema de “fireTableDataChanged();” é necessario?

valeu

oi,

Humm, vamos ver se eu te ajudo:

  1. Crie um objeto do tipo que você precisa, por exemplo o Computador

[code]public class Computador {

private String nome;
private String usuario;

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getUsuario() {
	return usuario;
}

public void setUsuario(String usuario) {
	this.usuario = usuario;
}

}[/code]

  1. No seu DAO crie métodos que façam a consulta que você precisa e retornem uma lista de computadores por exemplo

[code]public class ComputadorDAO {

public List&lt;Computador&gt; recuperaTodos() {

	// faz o SQL
	// recupera os dados do computador do resultset

            // o resultado eu vou recuperar da consulta do banco
	List&lt;Computador&gt; resultado = new ArrayList&lt;Computador&gt;();
	Computador comp = new Computador();
	comp.setNome("APTX");
	comp.setUsuario("ABC");

	resultado.add(comp);
	return resultado;
}

}[/code]

Não utilize array mais, utilize uma lista de objetos do tipo que você precisa, no caso Computador. (crie outros tipos se precisar)

Coloque nomes mais sugestivos para as suas variáveis, fica mais fácil a manutenção e tb entender o que está sendo feito.

Faça estas alterações e veja se funciona, qualquer coisa posta aqui

Abs