TableModel com Observable

3 respostas
T

Pessoal bom dia.
existe alguma maneira de criar uma classe que extenda de AbstractTableModel mas seja Observable utlizando o padrão de projeto observer??

os observers serão componentes swings…

algum help??

abrsss

3 Respostas

ViniGodoy

Sim. Mas vc quer que o TableModel seja o gerador de eventos, ou o listener?
Dá para fazer as duas coisas.

Também não entendo qual seja sua dificuldade em fazer isso.

T

estou criando uma tela de vendas onde o vendedor alterará a quantidade e % de descontos dos itens selecionados.
so que a cada modificação é necessário alterar o valores dos componentes FormatTextField
eu consegui usando tableModelListener…

mas comecei a estudar padrões de projeto e queria saber da possibilidade de utilizar Observer.
meu TableModel é este abaixo…

public class MovimentacaoVendasTableModel extends AbstractTableModel{

    private List<MovimentacaoItem> linhas;
    private String[] colunas;

    public MovimentacaoVendasTableModel(List<MovimentacaoItem> linhas, String[] colunas) {
        this.linhas = linhas;
        this.colunas = colunas;
    }

    public MovimentacaoVendasTableModel(List<MovimentacaoItem> linhas) {
        this.linhas = linhas;
        this.colunas = new String[]{"Item", "Marca", "Ref. Fabricante", "Unidade", "Quantidade",
            "Preço Unitário", "Valor Total", "Desconto", "Valor c/ Desconto"};
    }

    public MovimentacaoVendasTableModel() {
        this.linhas = new ArrayList<MovimentacaoItem>();
        this.colunas = new String[]{"Item", "Marca", "Ref. Fabricante", "Unidade", "Quantidade",
            "Preço Unitário", "Valor Total", "Desconto", "Valor c/ Desconto"};
    }

    @Override
    public int getRowCount() {
        return this.linhas.size();
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        MovimentacaoItem mov = this.linhas.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return mov.getProduto().toString();
            case 1:
                return mov.getProduto().getMarca() == null ? "" : mov.getProduto().getMarca().toString();
            case 2:
                return mov.getProduto().getCodFabricante();
            case 3:
                return mov.getProduto().getUnidadeMedida();
            case 4:
                return mov.getQuantidade();
            case 5:
                return (mov.getQuantidade() >= mov.getProduto().getQtiddeMinAtacado() ? mov.getProduto().getPrecoAtacado() : mov.getProduto().getPrecoVarejo());
            case 6:
                return (mov.getTotal());
            case 7:
                return (mov.getDesconto());
            case 8:
                return (mov.getTotal() - mov.getDesconto());
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int col) {
        return this.colunas[col];
    }

    public void addRow(MovimentacaoItem item) {
        this.linhas.add(item);

        // Pega a quantidade de registros e subtrai um para achar
        // o último índice. � preciso subtrair um, pois os índices
        // começam pelo zero.
        int ultimoIndice = getRowCount() - 1;

        // Reporta a mudança. O JTable recebe a notificação
        // e se redesenha permitindo que visualizemos a atualização.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public boolean isCellEditable(int row, int col) {
        // Quais colunas eu não quero deixar editar    
        if (col == 4 || col == 7) {
            return true;
        } else {
            return false;
        }

    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        MovimentacaoItem mov;
        switch (columnIndex) {
            case 4:

                mov = linhas.get(rowIndex);

                Double quantidade = Double.parseDouble(aValue.toString());
                mov.setQuantidade(quantidade);

                if (mov.getProduto().getQtiddeMinAtacado() > quantidade) {
                    mov.setTotal(quantidade * mov.getProduto().getPrecoVarejo());
                    mov.setPreco(mov.getProduto().getPrecoVarejo());
                } else {
                    mov.setTotal(quantidade * mov.getProduto().getPrecoAtacado());
                    mov.setPreco(mov.getProduto().getPrecoAtacado());
                }
                break;
            case 7:                
                linhas.get(rowIndex).setDesconto((Double) aValue);
                break;
            default : return;
        }

        fireTableCellUpdated(rowIndex, columnIndex);
        //atualizar a coluna do preço total
        fireTableCellUpdated(rowIndex, columnIndex + 1);
        fireTableCellUpdated(rowIndex, columnIndex + 2);
        fireTableCellUpdated(rowIndex, columnIndex + 4);
    }

    public void removeItem(int row) {
        this.linhas.remove(row);
        fireTableRowsDeleted(row, row);
    }

    public boolean isExist(int idProduto) {
        for (MovimentacaoItem mov : this.linhas) {
            if (mov.getProduto().getId() == idProduto) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Class getColumnClass(int c) {
        switch (c) {
            case 5:
                return Double.class;
            case 6:
                return Double.class;
            case 7:
                return Double.class;
            case 8:
                return Double.class;
            default:
                return super.getColumnClass(c);
        }
    }
    
    public MovimentacaoItem getRow(int row){
        return this.linhas.get(row);
    }
}
ViniGodoy

“Listener” é um dos nomes do padrão Observer. Os dois são a mesma coisa.

Mas daria para fazer uma implementação você mesmo. É só criar uma interface que define os eventos, colocar uma lista de gente que implementa essa interface no seu TableModel e, sempre que alguma coisa do seu interesse ocorrer, percorrer essa lista chamando o método do evento em questão.

Criado 19 de março de 2012
Ultima resposta 19 de mar. de 2012
Respostas 3
Participantes 2