Gravar dados direto no JTable

3 respostas
S

Olá pessoal, boa noite!!

Estou com as seguintes dúvidas:

1º.: Tenho em meu formulário um Jtable com informações de produtos (codigo, produto, qtd, vlr_unit, total) onde gostaria de inserir dados direto no Jtable quando passar para a próxima linha ele já grave no Banco de Dados.

2º.: Como eu faria para quando eu digitar no JTabel no campo nome as iniciais do produto e abrisse uma caixa de diálogo com todos os podutos com aquela descrição (Ex.: %Crm dental - Exibir todos os produtos com as iniciais Crm dental).

Obrigado pela ajuda de todos!!

Flw

3 Respostas

mvargens

1º -
http://www.exampledepot.com/egs/javax.swing.table/ValueEvent.html

2 -
Você precisa setar o Editor da célula como um JComboBox para conseguir digitar.
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#combobox

Depois tem que pegar o evento de digitação.
http://www.exampledepot.com/egs/javax.swing.text/ChangeEvt.html

Dai o código abaixo pode te ajudar a listar os produtos.
http://www.java2s.com/Code/Java/Swing-Components/SwingAutoCompleteComboBox.htm

Mas não vai ser bem uma caixa de dialogo. Se quiser fazer isso mesmo, o mais facil seria pegar o evento de digitação (change) de um JTextField, e criar um JDialog com uma Grid com os dados do produto. Dai ao escolher o produto vc joga os dados devolta na linha. Mas é chato fazer assim, porque no construtor da JDialog, vai ter que passar a JTable como referência, e usa-la para conseguir setar os dados. Mas enfim, se tiver que ser assim, paciência. Agora com o JComboBox fica mais elegante.

Sempre que trabalhar com Swing consulte esses links que vão te ajudar muito:
http://www.exampledepot.com/egs/?
http://java.sun.com/docs/books/tutorial/ui/features/components.html

marcosarantesj

Tem que criar um jDialog e colocar a consulta lá. Enquanto o jDialog estiver aberto, o usuário não poderá fazer nada, porque ele trava todos os forms. Olha um exemplo.
Primeiro, no jDialog que você criou, crie uma função que retorne o campo que você quer.
Na sua classe declare como públicas. O okSelecionado vai ser visualizado por qualquer classe, para ver se foi selecionado ou não uma linha no jTable.

private String nome;
public boolean okSelecionado;

Abaixo uma variável que vai retornar o nome selecionado. Pode criar mais variáveis para retornar mais campos. E o evento do click duplo do mouse que fecha a janela e mostra o nome selecionado no campo que você quer.

public String getNome() {
        nome = jTable1.getModel().getValueAt(jTable1.getSelectedRow(), 0).toString();
        return nome;
    }

    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        if (jTable1.isRowSelected(jTable1.getSelectedRow())) {
            okSelecionado = true;
        } else {
            okSelecionado = false;
        }
        if (evt.getClickCount() == 2) {
            this.dispose();
        }

    }                                    

    private void jTable1KeyReleased(java.awt.event.KeyEvent evt) {                                    
}

Agora no form principal, o evento do botão

private void btnConsultaActionPerformed(java.awt.event.ActionEvent evt) {         
jdfrmConsulta cl = new jdfrmConsulta(null, closable);
//        this.getDesktopPane().add(ca);
        cl.setVisible(true);
        cl.toFront();
//        abrirTela(ca.getClass());
        if (cl.okSelecionado == true) {

            jCombo.setSelectedItem(cl.getNome());
            cl.setVisible(false);
            cl.dispose();

        }
}

É só isso. Implemente da maneira que achar melhor.

marcosarantesj
Respondi a número 2. Agora a número 1. Para inserir diretamente na jTable, tem que declarar como público o modelo, caso contrário, ele vai sempre apagar para adicionar novamente. Primeiro declare como públicas. Coloque uma variável para receber o valor da jTable ou use sua classe se tiver.
String nome;
String[] coluna = {"Nome da coluna"};
    DefaultTableModel modelo = new DefaultTableModel(null, coluna) {
        //Não permitir a edição das células

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
Agora pode colocar no evento focusLost do último controle ou ENTER, usando o evento keyPressed, keyReleased ou keyTyped.
modelo.insertRow(modelo2.getRowCount(), new Object[]{jCombo.getSelectedItem()});
jTable1.setModel(modelo2);
Agora para gravar de um por um, eu não recomendo, porque eu acho que o certo seria somente quando adicionar tudo e aí sim salvar. Mas para salvar a cada adição, coloque uma condição para que se houver algo na jTable, salve. O problema é que se excluir um ítem salvo tem que excluir no banco de dados também, por isso não recomendo dessa maneira. Vamos então ao código para salvar de um por um.
if(jTable1.getRowCount()>0){
//Ele pega a última linha adicionada na jTable
//Passa a linha e depois o índice, que começa do 0
//Altere o índice
nome=jTable1.getValueAt(jTable1.getRowCount()-1, 0);
}
Pegue o valor e salve no banco. No caso acima, a variável nome e salve no banco de dados.
Criado 31 de agosto de 2009
Ultima resposta 3 de fev. de 2011
Respostas 3
Participantes 3