Problema com JTable e AbstractTableModel

6 respostas
maruero

Estou com um pequeno problema.

Quando eu mudo os dados de minha tabela com setValueAt() eu coloquei um fireTableDataChanged(); mas a tabela nao é repintada, e as informações só aparecem na tabela quando eu obrigo a tabela a ser repintada, por exemplo.: eu minimixo e maximizo a JFrame que contem a JTable.

O fireTableDataChanged() não teria que repintar minha tabela???

6 Respostas

ramilani12

Vc teria que remontar a sua JTable o mesmo metodo que vc cria usaria para remontar.

lina

Oi,
não é bem assim… cada vez que você instancia a mesma você a perde… e reconstrói uma no lugar…

de um repaint em sua JTable no momento desejado…

Tchauzin!

maruero

O engraçado é que ta cherando a algum bug ou do meu código, heheheheheh ou do fireTableDataChanged();

Pq o papel do fireTableDataChanged(); é atualizar a minha tabela, ou seja,
chamar todos os metodos da meu modelo necessários para a atualização visual da minha tabela! ( getColumnCount(), getRowCount(), getValueAt(), etc. )ou estou errado?

Já tentei colocar um repaint(), mas nao deu certo!
Como eu disse só funciona se eu realmente obriga-la a repinta, alterando o status da Jframe que ela está. Mas isso é um quebra galho horrivel. hehehehhehehehehehe

ME AJUDEM!!!

Marky.Vasconcelos

vc já tentou usar

fireTableStructureChanged();?

seu model estende de AbstractTableModel();?

se quiser te passo minha classe que estende AbstractTableModel pra vc ver

maruero

já usei sim, dá uma olhada no código:

class regGrupo{
	
	private String cadastro;
	private String municipio;
	private String proprietario;
	private String propriedade;
	private String grupo;
	
	public regGrupo( String cad, String mun , String prt , String prp , String gru ){
		cadastro = cad;
		municipio = mun;
		proprietario = prt;
		propriedade = prp;
		grupo = gru;
	}
	
	public String getCampos( int camp ){
		switch( camp ){
		case 0:
			return cadastro;
		case 1:
			return municipio;
		case 2:
			return proprietario;
		case 3:
			return propriedade;
		default:
			return null;
		}
	}
	public boolean isGrupo( String gru ){
		if( grupo == null )
			return false;
		return grupo.equals( gru ) ? true : false;
	}
	
}

class modeloTabGrupo extends AbstractTableModel implements ActionListener{

	private Vector<regGrupo> dados = new Vector<regGrupo>();
	private Vector<regGrupo> data = new Vector<regGrupo>();
	private String[] colunas ={ "Cadastro" , "Município" , "Proprietário" , "Propriedade" }; 
	private String grupo = null; 
	
	public void addTableModelListener(TableModelListener arg0) {		
	}

	public void filtra(){
		dados.removeAllElements();
		for( regGrupo reg : data ){
			if( reg.isGrupo( grupo ) )
				dados.add( reg );
		}
		this.fireTableDataChanged();
                this.fireTableStructureChanged();
	}
	
	public Class<?> getColumnClass(int arg0) {
		return String.class;
	}

	public int getColumnCount() {
		return colunas.length;
	}

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

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

	public void addReg( String cad, String mun, String prt, String prp, String gru){
		data.add( new regGrupo( cad , mun , prt , prp , gru) );
		this.filtra();
	}
	
	public Object getValueAt(int linha, int coluna ) {
		if( grupo == null )
			return null;
		
		regGrupo reg = dados.get( linha );
		return reg.getCampos( coluna );		
	}

	public boolean isCellEditable(int arg0, int arg1) {
		return false;
	}

	public void removeTableModelListener(TableModelListener arg0){ }
	
	public void setValueAt(Object arg0, int arg1, int arg2) { }

	public void actionPerformed(ActionEvent e) {
		JComboBox box = ( JComboBox )e.getSource();
		grupo = (String) box.getSelectedItem();
		if( grupo == "" )
			grupo = null;
		this.filtra();		
	}
}

o ouvinte do actionListener está ouvindo um comboBox e q a partir dele q eu quero q mude a tabela.
ele está ouvindo corretamente.
me ajuda ai!!!

Marky.Vasconcelos

Vou mandar o meu código e ve se te ajuda

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class AbstractTableResult extends AbstractTableModel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public ArrayList<String[]> date = new ArrayList<String[]>();

	public String[] colunas;
	
	public AbstractTableResult(String[] col){
		colunas = col;
	}
	public int getColumnCount() {
		return colunas.length;
	}
	public int getRowCount() {		
		return date.size();
	}
	public Object getValueAt(int row, int col) {
		return date.get(row)[col];
	}
	public boolean isCellEditable(){
		return false;
	}
	@Override
	public String getColumnName(int col){
		return colunas[col];
	}
	public void addRow(String[] dados){
		date.add(dados);
		fireTableStructureChanged();
	}
	public void clear() {
		this.date.clear();
		fireTableStructureChanged();
		
	}
}
e um exemplo de como usalo
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;

import org.hibernate.Session;

import Hibernate.HibernateFactory;
import cliente.Cliente;

public class pesquisaCotacoes extends javax.swing.JFrame {
	public static int row;
	/**
	 * 
	 */
	private static final long serialVersionUID = 5871561169689193601L;
	/**
	 *
	 * @author  Junior
	 */ 
	    public pesquisaCotacoes() {
	    	
	        initComponents();
	    }                      
	    private void initComponents() {
	        jScrollPane1 = new javax.swing.JScrollPane();
	        jTable1 = new javax.swing.JTable();
	        jButton1 = new javax.swing.JButton();
	        jButton2 = new javax.swing.JButton();
	        jTextField1 = new javax.swing.JTextField();
	        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
	        String[] colunas = {"N° Cotação","Valor Frete","Cliente"};
            model = new AbstractTableResult(colunas);
	        jTable1.setModel(model);
	        TableColumn column = null;
	        for(int i = 0; i < 3; i++) {
	          column = jTable1.getColumnModel().getColumn(i);
	          if(i == 0){
	            column.setPreferredWidth(8);
	          }else if(i == 1){
	            column.setPreferredWidth(45);
	          }else{
	        	  column.setPreferredWidth(180);
	          }
	        }
	    	jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	    	jTable1.setRowSelectionAllowed(true);
			ListSelectionModel rowSM = jTable1.getSelectionModel();
			rowSM.addListSelectionListener(new ListSelectionListener(){
				public void valueChanged(ListSelectionEvent e) {
					if(e.getValueIsAdjusting()) 
			               return;

			            ListSelectionModel lsm = (ListSelectionModel)e.getSource();
			            if(lsm.isSelectionEmpty()){
			               System.out.println("Nenhuma linha selecionada.");
			            }
			            else{
					int selectedRow = lsm.getMinSelectionIndex();
		               System.out.println(selectedRow);
		               row = selectedRow;
			            }}});
			jTable1.addMouseListener(new MouseAdapter(){
			      public void mouseClicked(MouseEvent e){
			          if(e.getClickCount() == 2){
			        		Session session = new HibernateFactory().getSession();
			        		long c = (long) Integer.valueOf(row+1);
			        		Cotacao ac = new Cotacao().procurarCotacao(c);
			        		Cliente owner = (Cliente) session.load(Cliente.class, ac.getIdCliente());
			        		FCotacao ab = new FCotacao(owner.getCNPJ());
			        		ab.setVisible(true);
			        		ab.fieldsCliente();
			        		ab.fieldsCotacao(ac);
			        		ab.fieldsCotacaoTable(ac);
			        		ab.cotacaoNuF.setText(String.valueOf(ac.getId())+"/07");
			        	
			        		setVisible(false);
					          }
			        }
			       });
	        jScrollPane1.setViewportView(jTable1);

	        jButton1.setText("Abrir Cota\u00e7\u00e3o");

	        jButton2.setText("Procurar:");
	        
	       	        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
	        getContentPane().setLayout(layout);
	        layout.setHorizontalGroup(
	            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
	            .addGroup(layout.createSequentialGroup()
	                .addContainerGap()
	                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
	                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
	                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
	                        .addComponent(jButton2)
	                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
	                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 192, Short.MAX_VALUE)
	                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
	                        .addComponent(jButton1)))
	                .addContainerGap())
	        );
	        layout.setVerticalGroup(
	            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
	            .addGroup(layout.createSequentialGroup()
	                .addContainerGap()
	                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)
	                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
	                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
	                    .addComponent(jButton1)
	                    .addComponent(jButton2)
	                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
	                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
	        );
	        pack();
	        setVisible(true);
	    } 
    private AbstractTableResult model;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextField jTextField1;  
    }
Criado 14 de maio de 2007
Ultima resposta 17 de mai. de 2007
Respostas 6
Participantes 4