Boa tarde!
Tentando ser direto.
Um objeto Cliente e um objeto Contato.
O objeto cliente tem uma ArrayList< Contato >.
Essa ArrayList será visualizada pelo usuário do programa através de uma JTable com uma TableModel para o contato em um JFrame.
Neste JFrame existem duas abas e em cada aba um JPanel.
JFrame janela_principal
JPanel dados_pessoais
JPanel contatosJTable(TableModelContato)
Para simplificar, o objeto Cliente somente será iniciado no JFrame, o JPanel dados_pessoais receberá os dados pessoais do objeto cliente, e o JPanel contatos receberá a ArrayList de contatos do mesmo objeto cliente.
Agora vem o problema, sempre que eu modifico o objeto cliente, sendo carregando um cliente no banco de dados, reiniciando as informações do mesmo ( Cliente cliente = new Cliente(); ) o JTable não se sincroniza com o ArrayList deste objeto.
Minha possível solução será criar uma classe que estenda a classe ArrayList, adicionar métodos na mesma para sincronizar com o JTable e depois mandar os valores para a super classe.
Isso deu certo, porém, um problema surgiu ao utilizar o método:
for(Iterator< Contato > contato = contatos.iterator(); contato.hasNext(); ) {
Contato c = contato.next();
if(c.getContato().isEmpty()) {
contato.remove();
}
}
Pois eu não consigo/não sei como adicionar funções sem alterar o princípio do método Iterator contido na super class
Basicamente:
public class Contato {
private String contato;
public Contato() {
contato = new String();
}
public String getContato() {
return this.contato;
}
public void setContato(String contato) {
this.contato = contato;
}
}
public class Cliente {
private String nome, rg, cpf;
private ArrayListContato<Contato> contatos;
public Cliente() {
nome = new String();
rg = new String();
cpf = new String();
contatos = new ArrayList<Contato>();
}
public String getNome() {
return nome;
}
public String getRG() {
return rg;
}
public String getCPF() {
return cpf;
}
public ArrayListContato<Contato> getContatos() {
return contatos;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setRG(String rg) {
this.rg = rg;
}
public void setCPF(String cpf) {
this.cpf = cpf;
}
public void setContatos(ArrayListContato<Contato> contatos) {
this.contatos = contatos;
}
public class TableModelContato extends AbstractTableModel {
private ArrayListContato<Contato> dados;
private String[] colunas = {"Telefone"};
public TableModelContato(ArrayListContato<Contato> contatos) {
this.dados = contatos;
}
public void addRow(Contato contato) {
this.dados.add(contato);
this.fireTableDataChanged();
}
public String getColumnName(int num) {
return this.colunas[num];
}
public int getRowCount() {
return dados.size();
}
public int getColumnCount() {
return colunas.length;
}
public Object getValueAt(int linha, int coluna) {
switch (coluna) {
case 0:
returndados.get(linha).getContato();
default:
return null
}
}
public void removeRow(int linha) {
this.dados.remove(linha);
this.fireTableRowsDeleted(linha, linha);
}
public void removeRow(Contato _contato) {
int x = 0;
for(Iterator<Contato> contato = dados.iterator(); contato.hasNext();) {
ContatoImp c = contato.next();
if(c == _contato) {
contato.remove();
}
x++;
}
this.fireTableRowsDeleted(x, x);
}
public ContatoImp get(int linha) {
return this.dados.get(linha);
}
public boolean isCellEditable(int linha, int coluna) {
return false;
}
public void removeAllRows() {
while(this.dados.size() > 0) {
this.dados.remove(0);
this.fireTableRowsDeleted(0, 0);
}
}
public ArrayListContato<Contato> getAllRows() {
return this.dados;
}
public void dataChanged() {
this.fireTableDataChanged();
}
public class ArrayListContato<ContatoImp> extends ArrayList<ContatoImp> {
public ArrayListContato() {
super();
}
public boolean add(Contato contato, TableModelContato table_model) {
table_model.dataChanged();
return super.add(contato);
}
public boolean remove(Contato contato, TableModelContato table_model) {
table_model.dataChanged();
return super.remove(contato);
}
}
Até aqui funcionou tranquilamente, porém, não funcionou com o Iterator, e não tenho ideia de como implementá-lo.
Preciso do Iterator pois ele é Thread Safe.
Se alguém puder me dar uma luz, ou um caminho melhor. Agradeço!