Incluir Objeto em linha de JTable

3 respostas
S

Amigos,

Estou a dois dias tentando solucionar esse problema e até agora não consegui. Segue abaixo minhas classes, em seguida falo o que estou tentando fazer.

package novoprojeto;

import java.util.ArrayList;
import javax.swing.JTable;

public class FormPrincipal extends javax.swing.JFrame {
    
    MinhaTabela mt;
    FormIncluir fi;
    
    public FormPrincipal() {
        initComponents();
    }
    
        @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        JTable tabela = new JTable();
        ArrayList<Carro> carro = new ArrayList();
        mt = new MinhaTabela(carro);
        tabela.setModel(mt);
        jScrollPane2 = new javax.swing.JScrollPane(tabela);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("Incluir");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Excluir");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(32, 32, 32)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(49, 49, 49))
        );

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 431, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(22, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        fi = new FormIncluir();
        fi.setVisible(true);
        fi.setDefaultCloseOperation(HIDE_ON_CLOSE);

    }                                        

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration
package novoprojeto;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class MinhaTabela extends AbstractTableModel {
       
    private ArrayList<Carro> linhas = null;
    private static final String[] colunas = { "Marca", "Modelo", "Placa", "Ano" };
    
    // Construtor da classe recebe os dados a ser populado 
        public MinhaTabela(ArrayList<Carro> c) {
        //linhas = new ArrayList<>(c);
            this.linhas = c;
        fireTableStructureChanged();
    }
   
    // Método sobrescrito que retorna o número de linhas do JTable, após populado  
    @Override
    public int getRowCount() {
        if (this.linhas == null)  
      {  
         return 0;  
      }   
      else  
      {  
         return this.linhas.size();  
      }  
    }
    
    // Método sobrescrito que retorna o número de colunas do JTable após populado  
    @Override
    public int getColumnCount() {
        return colunas.length;
    }
    
    // Método sobrescrito que vai popular e retornar cada célula do JTable
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
            Carro c = linhas.get(rowIndex);
            Object row = null;
            switch(columnIndex){
                case 0: row = c.getMarca();
                break;
                case 1: row = c.getModelo();
                break;
                case 2: row = c.getPlaca();
                break;
                case 3: row = c.getAno();
                break;
            }
           return row;
    }
          /* Este método sobrescrito, permite voce editar o JTable, caso o método anterior 
          tenha algumas colunas de algumas ou todas linhas editáveis setadas para true, 
          ou que tenha como retorno o valor true para todas as linhas e colunas. */  
        public void setValueAt(Object value, int rowIndex, int columnIndex){
            Carro c = linhas.get(rowIndex);
            switch(columnIndex){
                case 0: c.setMarca((String)value);
                break;
                case 1: c.setModelo((String)value);
                break;
                case 2: c.setPlaca((String)value);
                break;
                case 3: c.setAno((Integer)value);
                break;
            }
        }
        
    /* Este método sobrescrito vai definir o nome das colunas 
    que foi atribuído na constante "col" logo no início da classe */  
    @Override
    public String getColumnName(int column){
        return colunas[column];
    }
    
    /* Este método criado por nós, vai retornar o conjunto 
    de dados inteiro do JTable, através de um List contendo 
    Objetos ClienteBean populados. */ 
    public ArrayList<Carro> getLinhas() {
        return linhas;
    }

        public void addRow(Carro c){
        linhas.add(c);
        fireTableDataChanged();
        //this.fireTableRowsInserted(linhas.size()-1,linhas.size()-1);
    }
}
package novoprojeto;

import javax.swing.JOptionPane;

public class FormIncluir extends javax.swing.JFrame {

    CadastroVeiculo cad = new CadastroVeiculo();
    
    public FormIncluir() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jTextFieldMarca = new javax.swing.JTextField();
        jTextFieldModelo = new javax.swing.JTextField();
        jTextFieldAno = new javax.swing.JTextField();
        jTextFieldPlaca = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Marca:");

        jLabel2.setText("Modelo:");

        jLabel3.setText("Ano:");

        jLabel4.setText("Placa:");

        jButton1.setText("Cadastrar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jTextFieldPlaca, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jTextFieldAno, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jTextFieldModelo, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel1)
                                .addGap(30, 30, 30)
                                .addComponent(jTextFieldMarca, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(148, 148, 148)
                        .addComponent(jButton1)))
                .addContainerGap(151, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextFieldMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextFieldModelo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jTextFieldAno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jTextFieldPlaca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 58, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(30, 30, 30))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
      String marca = jTextFieldMarca.getText();
      String modelo = jTextFieldModelo.getText();
      int ano = Integer.parseInt(jTextFieldAno.getText());
      String placa = jTextFieldPlaca.getText();
      cad.inserirCarro(marca, modelo, ano, placa);
      
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FormIncluir.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FormIncluir.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FormIncluir.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FormIncluir.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FormIncluir().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTextFieldAno;
    private javax.swing.JTextField jTextFieldMarca;
    private javax.swing.JTextField jTextFieldModelo;
    private javax.swing.JTextField jTextFieldPlaca;
    // End of variables declaration                   
}
package novoprojeto;

import javax.swing.JOptionPane;


public class CadastroVeiculo {
    
    MinhaTabela mt;

    public void inserirCarro(String marca, String modelo, int ano, String placa){
        
            try{
            
            if(!(marca.equals("") | modelo.equals("") | ano == 0 | placa.equals(""))){
            
            Carro novoCarro = new Carro();
            novoCarro.setMarca(marca);
            novoCarro.setModelo(modelo);
            novoCarro.setAno(ano);
            novoCarro.setPlaca(placa);
            mt.addRow(novoCarro);
            JOptionPane.showMessageDialog(null, "Veiculo Cadastrado com sucesso!");
                                        
            }else{
                throw new CampoNaoPreenchido("Algum campo não foi preenchido, favor verificar.");
            }
            
        }catch(CampoNaoPreenchido e){
                JOptionPane.showMessageDialog(null, e.getMessage());
        }
        
    }
    
}

Seguinte:

Na classe MinhaTabela eu criei um modelo de JTable.

Dentro da classe FormPrincipal eu instanciei a classe MinhaTabela e criei uma tabela dentro do formulário.

Na FormIncluir eu capturo os dados dos JtextField e através de um método passo os dados para a classe CadastroVeiculo.

Na classe CadastroVeiculo incluo dentro do Objeto Carro e tento através da instancia já iniciada da classe MinhaTabela incluir o Objeto dentro de um ArrayList que está na classe MinhaTabela.

O problema está ocorrendo exatamente na chamada desse método:

mt.addRow(novoCarro);

Ele retorna sempre o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Alguem sabe o q estou fazendo errado?

3 Respostas

geraldofrancisco

Deixa eu tentar entender, vc criou uma JTable e não consegue inserir dados dentro dela?
vou te mostrar como eu fiz em um trabalho que estou fazendo, assim ficou bem mais simples;
Lembrando que o arraylist é de um objeto criado para este sistema, o que me importa é o vetor que está sendo enviado!

public void AlteraTableVisual(JTable tb, ArrayList<Livro>carrinho){
		Object [][] linhas = new Object[carrinho.size()][2];
		for(int i = 0; i < carrinho.size(); i++){
			switch(carrinho.get(i).pegaNumTipo()){
			case 1:
				linhas[i][0] = carrinho.get(i).pegaVolume()+"º Vol Obra - "+carrinho.get(i).pegaIdioma();
				break;
			case 2:
				linhas[i][0] = carrinho.get(i).pegaVolume()+"º Vol Réplica - "+carrinho.get(i).pegaIdioma();
				break;
			case 3:
				linhas[i][0] = carrinho.get(i).pegaVolume()+"º Vol Tréplica - "+carrinho.get(i).pegaIdioma();
				break;
			case 4:
				linhas[i][0] = carrinho.get(i).pegaVolume()+"º Vol Histórico - "+carrinho.get(i).pegaIdioma();	
				break;
			case 5:
			case 7:
				linhas[i][0] = carrinho.get(i).pegaNome()+" - "+carrinho.get(i).pegaIdioma();	
				break;
			case 6:
				linhas[i][0] = "Cavaleiro - "+carrinho.get(i).pegaIdioma();	
				break;
			}
			linhas[i][1] = carrinho.get(i).pegaQuantidade();			
		}
		tb.setModel(new DefaultTableModel(linhas, new String[] { "Livro", "Quant" }));
		tb.setFillsViewportHeight(true);
		tb.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		tb.getColumnModel().getColumn(0).setPreferredWidth(310);
		tb.getColumnModel().getColumn(1).setPreferredWidth(100); 
	}
S

Acho que meu problema se resume ao seguinte:

Na classe FormPrincipal eu criei um Objeto

MinhaTabela mt = new MinhaTabela();

Só que agora eu preciso utilizar esse mesmo objeto na Classe CadastroVeiculo. Como faço?

geraldofrancisco

Então, como eu disse antes…

vc cria uma função tipo a minha e passa a sua jtable e seu array como parâmetros e monta um array como ele deve ser apresentado na table
no meu caso foi uma table de 2 colunas (livro e quant) por isso o array que eu montei tinha apenas 2 posições. Pode variar conforme a sua necessidade.

Criado 26 de junho de 2013
Ultima resposta 26 de jun. de 2013
Respostas 3
Participantes 2