DefaultTableModel addRow

Bom dia amigos

Eu tenho o seguinte código:

[code]jblistar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

            /*ClienteDAO clidao = new ClienteDAO();
             SimpleTableModel tabela = new SimpleTableModel(clidao.listaClientes(), colunas);
             JTable table = new JTable();
             table.setModel(tabela);
             jsp.setViewportView(table);*/

            ClienteDAO clidao = new ClienteDAO(); //Classe que faz a conexão ao banco de dados
            JTable tabela = new JTable(null, colunas); //Cria uma tabela simples
            DefaultTableModel dtm = (DefaultTableModel) tabela.getModel(); //Faço o cast DefaultTableModel para a tabela
            
            List <Cliente> lista; //Array simples
            
            lista = clidao.listaClientes (); //O array que recebe o resultado da consulta ao banco de dados (este método retorna um Array)

            for (int i = 0; i < clidao.listaClientes().size(); i++) {
                dtm.addRow(new Object[]{lista.get(i)});  //Vai adicionando linhas à tabela até terminar o array com os resultados do banco de dados
            }
            //jsp.????? Este é o meu jscrollpane, a pergunta é: o que eu coloco nele?
        }
    });[/code]

O que eu preciso fazer é ir adicionando as linhas à tabela até que o resultado do banco de dados chegue ao fim. A minha dúvida é se por um acaso isso está certo e o que eu devo adicionar ao jscrollpane para ele mostrar a tabela?

Obrigado.

Sua tabela tem só uma coluna? É o que parece pelo código que você escreveu.

Não, tem 3 colunas, Nome Sobrenome e CPF. O código fica assim daí:

Mas a minha dúvida é o que coloco no jscrollpane?

Acho mais fácil mostrar um exemplo.

package guj;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class ExemploJScrollPane extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JScrollPane scpMain = null;
    private JPanel pnlButtons = null;
    private JButton btnOK = null;
    private JButton btnCancel = null;
    private JPanel pnlInputFields = null;
    private JLabel lblName = null;
    private JTextField txtName = null;
    private JLabel lblAddress = null;
    private JTextField txtAddress = null;
    private JLabel lblPhone = null;
    private JTextField txtPhone = null;
    private JLabel lblCountry = null;
    private JComboBox cboCountry = null;
    private JLabel lblState = null;
    private JComboBox cboState = null;
    private JSplitPane splMain = null;
    private JScrollPane scpTable = null;
    private JTable tblTable = null;

    private JScrollPane getScpMain() {
        if (scpMain == null) {
            scpMain = new JScrollPane();
            scpMain.setViewportView(getPnlInputFields());
        }
        return scpMain;
    }
    private JPanel getPnlButtons() {
        if (pnlButtons == null) {
            pnlButtons = new JPanel();
            pnlButtons.setLayout(new FlowLayout());
            pnlButtons.add(getBtnOK(), null);
            pnlButtons.add(getBtnCancel(), null);
        }
        return pnlButtons;
    }
    private JButton getBtnOK() {
        if (btnOK == null) {
            btnOK = new JButton();
            btnOK.setText("OK");
        }
        return btnOK;
    }
    private JButton getBtnCancel() {
        if (btnCancel == null) {
            btnCancel = new JButton();
            btnCancel.setText("Cancel");
        }
        return btnCancel;
    }
    private JPanel getPnlInputFields() {
        if (pnlInputFields == null) {
            lblState = new JLabel();
            lblState.setText("State");
            lblCountry = new JLabel();
            lblCountry.setText("Country");
            lblPhone = new JLabel();
            lblPhone.setText("Phone");
            lblAddress = new JLabel();
            lblAddress.setText("Address");
            lblName = new JLabel();
            lblName.setText("Name");
            GridLayout gridLayout = new GridLayout();
            gridLayout.setRows(5);
            gridLayout.setColumns(2);
            pnlInputFields = new JPanel();
            pnlInputFields.setLayout(gridLayout);
            pnlInputFields.add(lblName, null);
            pnlInputFields.add(getTxtName(), null);
            pnlInputFields.add(lblAddress, null);
            pnlInputFields.add(getTxtAddress(), null);
            pnlInputFields.add(lblPhone, null);
            pnlInputFields.add(getTxtPhone(), null);
            pnlInputFields.add(lblCountry, null);
            pnlInputFields.add(getCboCountry(), null);
            pnlInputFields.add(lblState, null);
            pnlInputFields.add(getCboState(), null);
        }
        return pnlInputFields;
    }
    private JTextField getTxtName() {
        if (txtName == null) {
            txtName = new JTextField();
        }
        return txtName;
    }
    private JTextField getTxtAddress() {
        if (txtAddress == null) {
            txtAddress = new JTextField();
        }
        return txtAddress;
    }
    private JTextField getTxtPhone() {
        if (txtPhone == null) {
            txtPhone = new JTextField();
        }
        return txtPhone;
    }

    private JComboBox getCboCountry() {
        if (cboCountry == null) {
            cboCountry = new JComboBox();
        }
        return cboCountry;
    }
    private JComboBox getCboState() {
        if (cboState == null) {
            cboState = new JComboBox();
        }
        return cboState;
    }
    private JSplitPane getSplMain() {
        if (splMain == null) {
            splMain = new JSplitPane();
            splMain.setOrientation(JSplitPane.VERTICAL_SPLIT);
            splMain.setResizeWeight(0.5D);
            splMain.setBottomComponent(getScpTable());
            splMain.setTopComponent(getScpMain());
        }
        return splMain;
    }
    private JScrollPane getScpTable() {
        if (scpTable == null) {
            scpTable = new JScrollPane();
            scpTable.setViewportView(getTblTable());
        }
        return scpTable;
    }
    private JTable getTblTable() {
        if (tblTable == null) {
            tblTable = new JTable();
            // Só para não deixar em branco - obviamente você não deve
            // usar DefaultTableModel em uma aplicação normal. 
            tblTable.setModel(new DefaultTableModel (new String[][]{
                {"Joseph", "8 Mulholland Drive", "555-5555", "123-4567-8"},
                {"Apple", "One Infinite Loop", "777-7777", "823-4568-7"},
                {"Sun", "4150 Network Circle", "555-9SUN", "123-7777-8"},
                {"Oracle", "500 Oracle Parkway", "1-800-ORACLE1", "444-7777-8"},
                {"Microsoft", "One Microsoft Way", "882-8080", "444-9999-8"},
                {"Red Hat", "1801 Varsity Drive", "754-3700", "333-3339-9"},
                }, 
                new String[]{"Name", "Address", "Phone", "SSN"}));
        }
        return tblTable;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploJScrollPane thisClass = new ExemploJScrollPane();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }
    public ExemploJScrollPane() {
        super();
        initialize();
    }
    private void initialize() {
        this.setSize(300, 293);
        this.setContentPane(getJContentPane());
        this.setTitle("Teste JScrollPane");
    }
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getSplMain(), BorderLayout.CENTER);
            jContentPane.add(getPnlButtons(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }
}

Obrigado pela resposta entanglement, mas o seu exemplo piorou as coisas hehe. Veja, a minha dúvida é simples: eu tenho uma JTable e um DefaultTableModel, eu estou usando o addRow no DefaultTableModel, agora: qual deles eu adiciono ao JScrollPane, o JTable ou o DefaultTableModel? E qual método do JScrollPane eu utilizo para isso? add, setviewportview, setviewport?

Obrigado.

    private JScrollPane getScpTable() {  
        if (scpTable == null) {  
            scpTable = new JScrollPane();  
            scpTable.setViewportView(getTblTable());  
        }  
        return scpTable;  
    }

Aqui está escrito que você adiciona o JTable ao JScrollPane. Na verdade você não usa “add” e sim “setViewportView”. OK?

Acostume-se a ler esse tipo de código (que é gerado pelo WindowBuilder, plugin do Eclipse). Ele é muito organizado e lógico.

É que o meu programa eu estou fazendo todo ele manualmente, configuração dos componentes, suas localizações etc. Vou tentar aqui usando o seu exemplo.

Obrigado a todos pela ajuda.

Bom, aprenda a usar o WindowBuilder (plugin do Eclipse) e o layout MigLayout. Você vai ver que vai ganhar um tempo assombroso de desenvolvimento, vai conseguir também usar as melhores práticas e de quebra vai desenhar telas mais bonitas. Desenhar tudo manualmente - só se seu professor for cruel e não lhe deixar usar nada além do GridBagLayout ( minha opinião sobre o GridbagLayout é a mesma deste site: http://madbean.com/anim/totallygridbag/ )

Gostaria de aproveitar o tópico e fazer uma pergunta, se puderem responder por gentileza. Sei que as recomendações para criar JTable é de que não utilize DefaultTableModel. Normalmente eu arrasto o componente da paleta do NetBeans, mas vi num site que ao fazer isso deve-se implementar o DefaulTableModel.

Neste caso, para não implementar, eu devo criar a JTable toda na mão programando???

Confesso que não entendi muito bem isso. Ainda estou lendo sobre como criar meu próprio model.

Grato.

Pois é, o NetBeans não incentiva as melhores práticas :frowning: - por exemplo, o jeito mais fácil de criar uma JTable no NetBeans é um que já usa um DefaultTableModel :frowning: :frowning: :frowning:

Use um TableModel “genérico” como o ObjectTableModel que o MarkyVasconcelos aqui do fórum escreveu.