Controlar Array com Tabelas independentes - AbstractTableModel + JTable + Array [RESOLVIDO]

5 respostas
CLEYSON

Boa Tarde Companheiros ....

Preciso entender o uso correto do TableModel ...

Abaixo meu ModelTable:

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

public class ModelTable extends AbstractTableModel {

private ArrayList linhas = null;
private String [] colunas = null;
private boolean [] colsEdicao;

public ModelTable(ArrayList dados, String[] colunas, boolean [] edicao){
setLinhas(dados);
setColunas(colunas);
colsEdicao = edicao;
}


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];
}

public String[] getColunas() {return colunas;}
public ArrayList getLinhas() {return linhas;}
public void setColunas(String[] strings) {colunas = strings;}
public void setLinhas(ArrayList list) {linhas = list;}

    @Override
public void setValueAt(Object value, int row, int col){
    String [] linha = (String [])getLinhas().get(row);
    linha[col] = (String)value;
    fireTableCellUpdated(row,col);
}
public boolean isCellEditable(int row, int col){
    //return colsEdicao[col];
    if (col == 2){
     return false;
    }else {
     return true;
    }
}

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

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

public boolean removeRow(String val, int col){
    Iterator i = getLinhas().iterator();
    int linha = 0;
    while(i.hasNext()){
        String[] linhaCorrente = (String[])i.next();
        linha++;
        if( linhaCorrente[col].equals(val) ){
            getLinhas().remove(linha);
            fireTableRowsDeleted(linha,linha);
            return true; 
        }
    }
    return false;
}

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

}

Minha Classe:

public class PanelModular extends javax.swing.JPanel {
     
    PreencheCombo preencheCombo = new PreencheCombo(this);
    String[] codigo;
    String[] descricao;
    String[] unidade;
    String nomeColuna = "";
    private int tamanhoArray = 0;
    String dados[][]= {};
    String colunaNome[] = {"Codigo", "Descrição", "UN","Qtde"};
    ArrayList dadosTabela = new ArrayList();
    public boolean [] edicao = {false, true};
    ModelTable modeloMaterial = new ModelTable(dadosTabela, colunaNome, edicao);
    ModelTable modeloServico = new ModelTable(dadosTabela, colunaNome, edicao);
    public JTable jTServico = new JTable(modeloServico);
    public JTable jTModular = new JTable(modeloMaterial);
    JTabbedPane tabbedPane = new JTabbedPane();  


    
    /** Creates new form PanelOrcamento */
    public PanelModular() {

        initComponents();
        carregarCombos();

        tabbedPane.setBounds(0, 0, 730, 283);   
        jPAbas.add(tabbedPane);   
        
        //Aba Material  
        JPanel panelMaterial = new JPanel();
        panelMaterial.setLayout(new BorderLayout());   
        //jTModular = new JTable(dados,colunaNome); 
        JScrollPane scrollPaneMaterial = new JScrollPane();
        scrollPaneMaterial.setViewportView(jTModular);
        scrollPaneMaterial.setBounds(0, 0, 730, 283);    
        panelMaterial.add(scrollPaneMaterial); 
        jTModular.setBounds(0, 0, 730, 283);  
        jTModular.setModel(modeloMaterial);
        tabbedPane.addTab("Material", null, panelMaterial, null); 
        
        //Aba Serviço 
        JPanel panelServico = new JPanel();
        panelServico.setLayout(new BorderLayout());   
        //jTServico = new JTable(dados,colunaNome); 
        JScrollPane scrollServico = new JScrollPane();
        scrollServico.setViewportView(jTServico);
        scrollServico.setBounds(0, 0, 730, 283);    
        panelServico.add(scrollServico); 
        jTServico.setBounds(0, 0, 730, 283); 
        jTServico.setModel(modeloServico);
        tabbedPane.addTab("Serviço", null, panelServico, null); 
       
    }

...

Meu Botão de Inserir linha em Tabela:

private void jBInserirRegistroActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        
        String [] linha = {"","","",""}; 
        if (tabbedPane.getSelectedIndex() == 1){
            modeloServico.addRow(linha); 
        } else {
            modeloMaterial.addRow(linha);
            preencheCombo.carregarComboTable(jTModular,modeloMaterial,"tblMaterialServico","CodItem","Descricao"); 
        }
    }

O meu Problema é o seguinte:

Se a Aba de Material estiver selecionada deve-se inserir na Tabela JModular.
Se a Aba de Serviço estiver selecionada deve-se inserir na Tabela jTServico.

Acontece que apesar de dar um new ModelTable(dadosTabela, colunaNome, edicao) para ambas tabelas, as mesmas compartilham o mesmo array, ou seja, a linha é inserida corretamente na Tabela porém sempre carrega todos registros,tanto os já inseridos na JModular como os inseridos jTServico.

Vou ter que criar dois Arrays para controlar isso? o new não era pra criar um novo objeto e tratar os arrays independentes? :roll: :?:

Percebo que quanto mais eu fuço menos eu sei ...

Desde já agradeço!

5 Respostas

Marky.Vasconcelos

Isso por que voce tem apenas uma List chamada dadosTabela para as duas tabelas. Ao inserir em qualquer uma vai adicionar nesse mesmo List.

Uma solução seria:

ModelTable modeloMaterial = new ModelTable(new ArrayList(), colunaNome, edicao);
    ModelTable modeloServico = new ModelTable(new ArrayList(), colunaNome, edicao);
ViniGodoy

O ideal mesmo (antes de partir para soluções prontas como a minha e a do Mark), é você criar uma classe chamada Material e outra chamada Servico.
Depois, crie um MaterialTableModel que tenha um List<Material> dentro e um ServicoTableModel com um List<Servico> dentro.

Aí sim, use os models que trabalham diretamente com suas classes de negócio para resolver o problema.

CLEYSON

Boa Tarde …

:lol: Engraçado é que eu pensei em fazer isso mas a vergonha não me deixou … achei que ia ficar ridiculo fazer dois TableModel … kk

Eu e meu jeito de complicar … mas o caminho é esse … sempre avante … sempre estudando e perguntando …

Obrigado Mark_Ameba e ViniGodoy pela atenção dedicada no tópico …

Marky.Vasconcelos

De certa forma. Da pra fazer um TableModel unico. Mas tem que fazer algo para deixa-lo o mais genérico possivel.

CLEYSON

Beleza Mark_Ameba … acabei optando pelo new ArrayList() passado de parametro …

Valeu pela dica … :smiley:

Obrigado …

Criado 16 de julho de 2009
Ultima resposta 17 de jul. de 2009
Respostas 5
Participantes 3