Passar uma lista para o addRow (AbstractTableModel)[RESOLVIDO]

6 respostas
F

Boa noite galera!

É o seguinte estou tentando usar o AbstractTableModel e abandonar o DefaultTableModel rsrsrs…
Estou com a seguinte duvida minha consulta no banco me retorna uma lista, por exemplo, no DAO faço o select retornando
uma lista com os resultados e na minha camada de negocio chamo este metodo e se alista estiver vazia me retorna uma mensagem.
Pois então como faço para fazer com que está lista sai no meu JTable, vou ter que alterar meu metodo addRow?
O que posso fazer?
Obrigado Galera
:?:

6 Respostas

F

GAlera consegui implementar a lista porém estou com algumas duvidas.
Vou postar o código primeiro.

Método do botão pesquisar:
JButton btnPesquisarProf = new JButton("Pesquisar");
		btnPesquisarProf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ProfessorNegocio profNegocio = new ProfessorNegocio();
				Integer codProf;
				String[] colunas = {"ID","Cód. Professor","Nome","CPF","Especialidade","Formação","Telefone","Endereço"};
				
				if(edtCodProf.getText().equals("")){
					codProf = 0;
				}else{
					codProf = Integer.parseInt(edtCodProf.getText());
				}
				try{
					ArrayList<? extends Pessoa> listaProf = profNegocio.listar(
							edtNomeProf.getText(), codProf,
							edtCpfProf.getText());
					
					ProfessorModel modelo = new ProfessorModel(listaProf, colunas);
					System.out.println(modelo.getValueAt(0, 1));
					gridPesqProf.setModel(modelo);
					gridPesqProf.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
					
				}catch(Exception e1){
					JOptionPane.showMessageDialog(null,"Ocorreu o seguinte erro ao listar os professores: "+ e1.getMessage(),
                            "Erro", JOptionPane.OK_OPTION);
					e1.printStackTrace();
				}
			}
		});
Meu Modelo para o JTable:
public ProfessorModel(ArrayList dados, String[] colunas){
			setLinhas(dados);
			setColunas(colunas);
		}
		
		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];
		}
		
		
	}
Ao executar a tabela não é preenchida, no caso na camada de negocio a lista é verificada se está vazia, portanto a mesma não está. E ocorre este Excption:
java.lang.ClassCastException: br.com.framework.escola.entidades.pessoas.Professor cannot be cast to [Ljava.lang.String;
	at br.com.framework.escola.visao.gui.PesquisaProfessores$ProfessorModel.getValueAt(PesquisaProfessores.java:174)
	at br.com.framework.escola.visao.gui.PesquisaProfessores$2.actionPerformed(PesquisaProfessores.java:117)
referente a isto:
public Object getValueAt(int rowIndex, int columnIndex){
			String[] linha = (String[]) getLinhas().get(rowIndex);
			return linha[columnIndex];
		}

Oque estou fazendo errado?
Obrigado

F

Galera revisei o código e fiz algumas alterações

Conseguir fazer com que o exception desaparecesse, porém o nome das minhas colunas estão vindo assim:
br.com.framework.escola.entidades.pessoas.Professor@186d4c1
ou seja o nome do pacote, não entendi porque, porém quando chamo o método para retornar o nome da coluna, ele retorna o nome que eu defini Ah e ele não está trazendo os dados no Jtable. Obs: Ja coloquei ele dentro de uma scrollPane Segue o código fonte:
JButton btnPesquisarProf = new JButton("Pesquisar");
		btnPesquisarProf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ProfessorNegocio profNegocio = new ProfessorNegocio();
				Integer codProf;
				
				if(edtCodProf.getText().equals("")){
					codProf = 0;
				}else{
					codProf = Integer.parseInt(edtCodProf.getText());
				}
				try{
					ArrayList<? extends Pessoa> listaProf = profNegocio.listar(
							edtNomeProf.getText(), codProf,
							edtCpfProf.getText());
					
					ProfessorModel modelo = new ProfessorModel((List<Professor>) listaProf);
					gridPesqProf.setModel(modelo);
					gridPesqProf.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
					gridPesqProf.setAutoResizeMode(gridPesqProf.AUTO_RESIZE_ALL_COLUMNS);
					gridPesqProf.repaint();
					System.out.println(modelo.getColumnName(0));
					
					
				}catch(Exception e1){
					JOptionPane.showMessageDialog(null,"Ocorreu o seguinte erro ao listar os professores: "+ e1.getMessage(),
                            "Erro", JOptionPane.OK_OPTION);
					e1.printStackTrace();
				}
			}
		});
		btnPesquisarProf.setBounds(264, 83, 89, 23);
		panel.add(btnPesquisarProf);
		
		JScrollPane scrpPesq = new JScrollPane();
		scrpPesq.setBounds(10, 145, 487, 180);
		frmPesquisaProfessores.getContentPane().add(scrpPesq);
		
		gridPesqProf = new JTable();
		scrpPesq.setColumnHeaderView(gridPesqProf);
	}
	
	public class ProfessorModel extends AbstractTableModel{
		private List<Professor> linhas = null;
		private String[] colunas = {"ID","Cód. Professor","Nome","CPF","Especialidade","Formação","Telefone","Endereço"};
		
		
		public ProfessorModel(){
		}
		
		public ProfessorModel(List<Professor> dados){
			setLinhas(dados);
			setColunas(this.colunas);
		}
		
		public String[] getColunas(){
			return colunas;
		}
		
		public List<Professor> getLinhas(){
			return linhas;
		}
		
		public void setColunas(String[] strings){
			colunas = strings;
		}
		
		public void setLinhas(List<Professor> list){
			this.linhas = list;
			fireTableDataChanged();
		}
		
		public int getColumnCount(){
			return getColunas().length;
		}
		
		public int getRowCount(){
			return getLinhas().size();
		}
		
		public Object getValueAt(int rowIndex, int columnIndex){
			Professor professor = (Professor) linhas.get(rowIndex);
			return professor;
		}
		
		public boolean isCellEditable(int rowIndex, int columnIndex) {  
	        return true;  
	    } 
		
		public String getColumnName(int col){  
		    return getColunas()[col];  
		}
	  
		
	}
}
ViniGodoy

Leia o seguinte tutorial:

É importante entender o conceito antes de sair implementando na louca.

F

ViniGodoy:
Leia o seguinte tutorial:

É importante entender o conceito antes de sair implementando na louca.

Valeu Vini. Vou dar uma lida e qualquer coisa posto alguma dúvida se surgir
Abs

F
Realmente um excelente tutorial, agora conseguir entender o AbstractTableModel hehe.. POrém estou com algumas dúvidas, fiz o teste aqui e colocou na jtable os dados do banco normalmente, porém o que faltou foi o nome das colunas que não aparecerem e inclusive coloquei meu Jtable dentro de uma ScroolPane vou postar o código aqui: (Nota estou utilizando o Window Builder)
JButton btnPesquisarProf = new JButton("Pesquisar");
		btnPesquisarProf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ProfessorNegocio profNegocio = new ProfessorNegocio();
				Integer codProf;
				
				if(edtCodProf.getText().equals("")){
					codProf = 0;
				}else{
					codProf = Integer.parseInt(edtCodProf.getText());
				}
				try{
					ArrayList<? extends Pessoa> listaProf = profNegocio.listar(
							edtNomeProf.getText(), codProf,
							edtCpfProf.getText());
					
					ProfessorModel modelo = new ProfessorModel((List<Professor>) listaProf);
					gridPesqProf.setModel(modelo);
					/*ProfessorModel modelo = new ProfessorModel((List<Professor>) listaProf);
					gridPesqProf.setModel(modelo);
					gridPesqProf.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
					gridPesqProf.setAutoResizeMode(gridPesqProf.AUTO_RESIZE_ALL_COLUMNS);
					gridPesqProf.repaint();
					System.out.println(modelo.getColumnName(0));*/
					
					
				}catch(Exception e1){
					JOptionPane.showMessageDialog(null,"Ocorreu o seguinte erro ao listar os professores: "+ e1.getMessage(),
                            "Erro", JOptionPane.OK_OPTION);
					e1.printStackTrace();
				}
			}
		});
		btnPesquisarProf.setBounds(264, 83, 128, 23);
		panel.add(btnPesquisarProf);
		
		JScrollPane scrpPesq = new JScrollPane();
		scrpPesq.setBounds(10, 145, 882, 180);
		frmPesquisaProfessores.getContentPane().add(scrpPesq);
		
		gridPesqProf = new JTable();
		scrpPesq.setColumnHeaderView(gridPesqProf);
	}
	
	public class ProfessorModel extends AbstractTableModel{
		private String[] colunas = {"ID","Cód. Professor","Nome","CPF","Especialidade","Formação","Telefone","Endereço"};
		private List<Professor> linhas;
		
		private static final int ID = 0;
		private static final int COD_PROF = 1;
		private static final int NOME = 2;
		private static final int CPF = 3;
		private static final int ESPECIALIDADE = 4;
		private static final int FORMACAO = 5;
		private static final int TELEFONE = 6;
		private static final int ENDERECO = 7;
		
		public ProfessorModel(){
			linhas = new ArrayList<Professor>();
		}
		
	  public ProfessorModel(List<Professor>listaProfessores){
		  linhas = new ArrayList<Professor>(listaProfessores);
	  }
	  
	  public int getRowCount(){
		  return linhas.size();
	  }
	  
	  public int getColumnCount(){
		  return colunas.length;
	  }
	  
	  public String getColumnName(int columnIndex){
		  return colunas[columnIndex];
	  }
	  
	  @Override
	  public Class<?> getColumnClass(int columnIndex){
		  switch(columnIndex){
		  case ID:
			  return Integer.class;
		  case COD_PROF:
			  return Integer.class;
		  case NOME:
			  return String.class;
		  case CPF:
			  return String.class;
		  case ESPECIALIDADE:
			  return String.class;
		  case FORMACAO:
			  return String.class;
		  case TELEFONE:
			  return String.class;
		  case ENDERECO:
			  return String.class;
		  default:
			  throw new IndexOutOfBoundsException("columnIndex out of bounds");
		  }
	  }
	  
	  public boolean isCellEditable(int rowIndex, int columnIndex){
		  return false;
	  }
	  
	  public Object getValueAt(int rowIndex, int columnIndex){
		  Professor prof = linhas.get(rowIndex);
		  
		  switch(columnIndex){
		  case ID:
			  return prof.getIdProf();
		  case COD_PROF:
			  return prof.getCodigo();
		  case NOME:
			  return prof.getNome();
		  case CPF:
			  return prof.getCpf();
		  case ESPECIALIDADE:
			  return prof.getEspecialidade();
		  case FORMACAO:
			  return prof.getFormacao();
		  case TELEFONE:
			  return prof.getTelefone();
		  case ENDERECO:
			  return prof.getEndereco();
		  default:
			  throw new IndexOutOfBoundsException("columnIndex out of bounds");
		  }
	  }
	  
	  public void setValueAt(Object aValue, int rowIndex, int columnIndex){
		  Professor prof = linhas.get(rowIndex);
		  
		  switch(columnIndex){
		  case ID:
			  //prof.set
			  break;
		  case COD_PROF:
			  prof.setCodigo((Integer)aValue);
			  break;
		  case NOME:
			  prof.setNome((String)aValue);
			  break;
		  case CPF:
			  prof.setCpf((String)aValue);
			  break;
		  case ESPECIALIDADE:
			  prof.setEspecialidade((String)aValue);
			  break;
		  case FORMACAO:
			  prof.setFormacao((String)aValue);
			  break;
		  case TELEFONE:
			  prof.setTelefone((String)aValue);
			  break;
		  case ENDERECO:
			  prof.setEndereco((String)aValue);
			  break;
		  default:
			  throw new IndexOutOfBoundsException("columnIndex out of bounds");
		  }
		  
		  fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula

	  }
	// Retorna o sócio referente a linha especificada
	  public Professor getProfessor(int indiceLinha){
		  return linhas.get(indiceLinha);
	  }
	  
	// Adiciona o sócio especificado ao modelo
	  public void addProfessor(Professor professor) {
	      // Adiciona o registro.
	      linhas.add(professor);
	   
	      // Pega a quantidade de registros e subtrai 1 para
	      // achar o último índice. A subtração é necessária
	      // porque os índices começam em zero.
	      int ultimoIndice = getRowCount() - 1;
	   
	      // Notifica a mudança.
	      fireTableRowsInserted(ultimoIndice, ultimoIndice);
	  }
	   
	  // Remove o sócio da linha especificada.
	  public void removeProfessor(int indiceLinha) {
	      // Remove o registro.
	      linhas.remove(indiceLinha);
	   
	      // Notifica a mudança.
	      fireTableRowsDeleted(indiceLinha, indiceLinha);
	  }
	   
	  // Adiciona uma lista de sócios no final da lista.
	  public void addListaDeProfessores(List<Professor> professor) {
	      // Pega o tamanho antigo da tabela, que servirá
	      // como índice para o primeiro dos novos registros
	      int indice = getRowCount();
	   
	      // Adiciona os registros.
	      linhas.addAll(professor);
	   
	      // Notifica a mudança.
	      fireTableRowsInserted(indice, indice + professor.size());
	  }
	   
	  // Remove todos os registros.
	  public void limpar() {
	      // Remove todos os elementos da lista de sócios.
	      linhas.clear();
	   
	      // Notifica a mudança.
	      fireTableDataChanged();
	  }

		
	}

Uma ultima dúvida, há como eu colocar um "modo automático" nas linhas onde elas vão se redimensionar de acordo com o tamanho do campo?
Obrigado
Abs

F

up…

Criado 27 de janeiro de 2013
Ultima resposta 28 de jan. de 2013
Respostas 6
Participantes 2