Atualizar Tabela em um painel

2 respostas
J

Caros senhores, tenho um problema que esta me deixando encafifado. Depois de tentar de tudo quanto é geito, consegui fazer uma tabela que aparecesse no meu programa. Mas ainda não funciona do forma que eu preciso. Vamos lá.

Consegui fazer uma tabela com esta classe, as informações são pesquisadas em um BD. Note o parâmetro ‘OP’ que está sendo passado no método setDataTable (não sei se é a forma correta de se fazer, mas foi o único geito que consegui :lol: ).

public class setDataTable extends AbstractTableModel {
    private Object[][] data;
    private String[] columnNames = {"Codigo do Kit",
                                    "Nome do Kit",
                                    "Dia",
                                    "Posição"};

    @SuppressWarnings("BooleanConstructorCall")
    public Object[][] setDataTable(String OP){
        ArrayList<ArrayList> dados = new ArrayList<ArrayList>();
        Object info[][] = null;
        try {
            Statement stmt;
            stmt = (Statement) Conexao.getStatement();
            stmt.execute("SELECT a.CodKit, a.KitName, a.DiaKit, a.PosicaoLinha "
                    + "FROM Kits AS a, OPs AS b WHERE b.CEMBTopo = a.TopoKit AND "
                    + "b.OrdemProd = '"+OP+"'");                                                            //faz a consulta no BD com o parametro
            ResultSet rs;
            rs = stmt.getResultSet();
            while(rs.next()){
                if(rs.getRow() == 0){                                 //se o parametro OP, foi passado como nulo, ele sai. Se não ele popula a matriz com os dados do ResultSet
                    throw new Exception();
                }
                ArrayList<String> linha = new ArrayList<String>();
                linha.add(rs.getString("CodKit"));
                linha.add(rs.getString("KitName"));
                linha.add(rs.getString("DiaKit"));
                linha.add(rs.getString("PosicaoLinha"));
                dados.add(linha);
            }
            info = new Object[dados.size()][dados.get(0).size()];
            for(int i = 0;i <dados.size();i++){
                for(int r = 0; r < dados.get(r).size();r++){
                    info[i][r] = dados.get(i).get(r);                                  //estou convertendo o ListArray para uma matriz de objetos
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(A_FMKa_PlanejaPagamento_Tabela.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(A_FMKa_PlanejaPagamento_Tabela.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {

        }finally{
            data = info;
            return info;
        }
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        if(data == null){
            return 0;
        }else{
            return data.length;
        }
    }

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

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }
}

Dai escrevi um painel para receber os dados que a classe setDataTable retorna;

public class Tabela extends JPanel{

    public Tabela(String OP) {

        setDataTable tbl = new setDataTable();
        tbl.setDataTable(OP);

        JTable table = new JTable(tbl);
        table.setPreferredScrollableViewportSize(new Dimension(465, 210));
        table.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(table);//Create the scroll pane and add the table to it.
        add(scrollPane);//Add the scroll pane to this panel.

    }
}

E finalmente o frame que recebe o painel criado acima. uma quantidade grande de componentes swing

...
    private Tabela jTable1 = new Tabela(null); // quando este objeto é criado ele roda essas duas classes acima e passa como parâmetro null, então o retorno será somente os nomes das colunas
    private JButton jButton1 = new JButton();
...
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jButton1_actionPerformed(e);
            }
        });

Qual era o objetivo?
A String OP esta declara na minha classe, e a cada hora ela vai estar valendo um valor diferente. E quando eu clicasse no botão, o listeaner manda fazer as duas primeiras classes, só que agora com um parâmetro, retornando uma tabela diferente.

...
    private void jButton1_actionPerformed(ActionEvent e) {
        jTable1 = new A_FMKa_PlanejaPagamento_Tabela(OP);
        jTable1.repaint();
        jTable1.revalidate();
        jTable1.validate();
    }

O curioso é, que quando eu coloco um parâmetro valido, ali em cima onde esta null, ele cria a tabela e mostra a informação no painel. Mas quando eu lanço o listeaner com um valor diferente nada acontece.

É isto dai, abraços.

2 Respostas

ViniGodoy

Siga os links do meu anexo.

O ideal é que seu TableModel trabalhe com suas classes de negócio diretamente, não com array de Objects.

J

show de bola, esse Mark Utils é muito bacana :stuck_out_tongue: . Funcionou certinho, fiz da seguinte forma.

public class PlanDeKit {
    @Resolvable(colName = "Codigo")
    private String CodKit;
    @Resolvable(colName = "Nome")
    private String KitName;
    @Resolvable(colName = "Dia")
    private String DiaKit;
    @Resolvable(colName = "Posição")
    private String PosicaoLinha;

    public PlanDeKit(String CodKit, String KitName, String DiaKit, String PosicaoLinha){
        this.CodKit = CodKit;
        this.KitName = KitName;
        this.DiaKit = DiaKit;
        this.PosicaoLinha = PosicaoLinha;
    }
}

Meu listeaner já faz a pesquisa e passa os dados para a classe que monta a tabela

private List<PlanDeKit> getData() {
        List<PlanDeKit> list = new ArrayList<PlanDeKit>();
            Statement stmt;
            stmt = (Statement) Conexao.getStatement();
            stmt.execute("SELECT a.CodKit, a.KitName, a.DiaKit, a.PosicaoLinha "
                    + "FROM Kits AS a, OPs AS b WHERE b.CEMBTopo = a.TopoKit AND "
                    + "b.OrdemProd = '"+jComboBox3.getSelectedItem()+"'");
            ResultSet rs;
            rs = stmt.getResultSet();
            while(rs.next()){
                list.add(new PlanDeKit(rs.getString("CodKit"),
                        rs.getString("KitName"),
                        rs.getString("DiaKit"),
                        rs.getString("PosicaoLinha")));
            }
        return list;
    }
...
        AnnotationResolver resolver = new AnnotationResolver(PlanDeKit.class);
        final ObjectTableModel<PlanDeKit> tabela = new
                ObjectTableModel<PlanDeKit>(resolver,
                "CodKit:Codigo,KitName:Nome,DiaKit:Dia,PosicaoLinha:Posição");
        JTable jTable1 = new JTable(tabela);
        tabela.setEditableDefault(false);
        JScrollPane pane = new JScrollPane();

        pane.setViewportView(jTable1);
        pane.setPreferredSize(new Dimension(485,210));

        pane.setBounds(new Rectangle(10, 265, 485, 210));
...

Ufa, deu um baita trabalho fazer funcionar hehe. 8) .
Se tiver alguém tiver alguma sugestão de como deixa melhor, :smiley: .
Agora, somente preciso arranjar um listeaner de quando o usuário clicar duas vezes em uma linha da tabela, se alguém conhecer um… :lol: :lol: :lol:

Abraços. value

Criado 16 de outubro de 2010
Ultima resposta 17 de out. de 2010
Respostas 2
Participantes 2