[Resolvido] disparando um fireTableRowsUpdated através de um outro frame

2 respostas
bobmatta

Seguinte galera,

Estou estudando Swing, desenvolvendo um aplicativo jurídico de consulta de rubricas. Até agora ele tem dois frames, o primeiro contendo a seguinte JTable:


(o campo id vai sair da tabela depois)

Nesse caso, somente uma linha é selecionável. Ao clicar na linha e no botão “Editar”, pego os dados da linha selecionada e abro um novo frame, contendo os JTextFields já populados com os respectivos dados. Aí o código do ActionPerformed:

private void editarButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        
        int viewRow = tabela.getSelectedRow();
        if (viewRow == -1) {
            JOptionPane.showMessageDialog(null, "Selecione uma linha para ser alterada.");
        } else {

        int modelRow = tabela.convertRowIndexToModel(viewRow);
        RubricaTableModel modelo = (RubricaTableModel) tabela.getModel();
        Rubrica rubrica = modelo.getRubrica(modelRow);
        
        RubricaUpdateGUI rubricaUpdate = new RubricaUpdateGUI(rubrica.getId(), rubrica.getDescricao(), rubrica.getAmbito(), rubrica.getCodigo());
        rubricaUpdate.setVisible(true);
        rubricaUpdate.setAlwaysOnTop(true);
        }
    }

Segundo frame:

A dúvida que estou tendo é a seguinte: Como faço para acionar um fireTableRowsUpdated ou algo do tipo na primeira tabela ao clicar no botão “Atualizar”, no segundo frame??

A propósito, tô usando um TableModel baseado no modelo do Eric Yuzo, taí o código:

public class RubricaTableModel extends AbstractTableModel {

    private List<Rubrica> linhas;

    private String[] colunas = new String[]{
        "id", "Descricao", "Ambito", "Codigo"};

    public RubricaTableModel() {
        linhas = new ArrayList<Rubrica>();
    }

    public RubricaTableModel(List<Rubrica> rubricas) {
        linhas = new ArrayList<Rubrica>(rubricas);
    }

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

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

    @Override
    public String getColumnName(int columnIndex) {
        return colunas[columnIndex];
    }

	@Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return int.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return long.class;
            default:
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Rubrica rubrica = linhas.get(rowIndex);
        switch (columnIndex) {

            case 0:
                return rubrica.getId();
            case 1:
                return rubrica.getDescricao();
            case 2:
                return rubrica.getAmbito();
            case 3:
                return rubrica.getCodigo();
            default:
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

    }

	@Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public Rubrica getRubrica(int indiceLinha) {
        return linhas.get(indiceLinha);
    }

    public void addRubrica(Rubrica rubrica) {
        linhas.add(rubrica);

        int ultimoIndice = getRowCount() - 1;
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public void removeFicha(int indiceLinha) {	
        linhas.remove(indiceLinha);

        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    public void addListaDeRubrica(List<Rubrica> rubricas) {
        int tamanhoAntigo = getRowCount();
        linhas.addAll(rubricas);
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
    }

    public void limpar() {
        linhas.clear();
        fireTableDataChanged();
    }

    public boolean isEmpty() {
        return linhas.isEmpty();
    }
}

Desde já, valeu a ajuda! :slight_smile:

2 Respostas

drsmachado

Bom, existe o pattern observable e as soluções menos nobres:

  • Passar a instância do JFrame (inteiro) que representa a tabela para o objeto do novo JFrame.
OutroFrm frm2 = new OutroFrm(this);
  • Passar a instância do objeto do TableModel para o objeto do JFrame.
OutroFrm frm2 = new OutroFrm(getOTableModel());
bobmatta

Beleza, resolvi mudando o segundo frame para JDialog e adaptando as soluções “menos nobres”. O Observer Pattern parece ser bem interessante, vou dar uma estudada nele por aqui!
valeu pela dica drsmachado!

Criado 25 de fevereiro de 2013
Ultima resposta 27 de fev. de 2013
Respostas 2
Participantes 2