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
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
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.
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);
}
}
“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.