Erro ao deletar linha da tabela e Dados não Atualizam na tabela

6 respostas Resolvido
netbeansjframejtablejavaarray
C

Estou fazendo um sistema de vendas e estou com dois problemas, primeiro na hora de deletar, exemplo se incluo uns 10 produtos e vou excluido ele dá erro Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: -1e se clico no mesmo pra excluir denovo funciona, não dá erro sempre, mas sempre que incluo muitos produtos e quero excluir ele dá esse erro.

e também estou com problema na hora de atualizar a tabela ela só atualiza se eu chamar no evento formWindowGainedFocus, o que eu precisava é que assim. Nesse jFrame que tem a tabela, tem um botão incluir produto que abre outro Jframe que também tem o botão incluir, e quando fosse incluso o produto ele já atualizasse o jframe da tabela, mas ele só atualiza quando o foco volta esse frame.

6 Respostas

L

Sobre o ArrayIndexOutOfBoundsException, é impossível dizer o que é o problema sem olhar o código. Como o próprio nome da exceção diz, sua lógica está tentando acessar um array em um índice que não existe.

Sobre a atualização da tabela, não dependa dos eventos do swing para fazê-la. Implemente ganchos entre as janelas e controle tudo manualmente, como por exemplo:

public interface GanchoDeTelaDeCadastroDeProduto {
    void produtoFoiInserido();
}

Sua interface principal (a que tem a tabela) vai implementar essa interface. Quando o método produtoFoiInserido() for chamado, você dá um refresh na tabela.

Já o objeto da tela de cadastro de usuário, vai ter uma propriedade do tipo GanchoDeTelaDeCadastroDeProduto. Tipo assim:

public class TelaCadastroProduto extends JFrame (sei , qualquer coisa) {
    ...
    GanchoDeTelaDeCadastroDeProduto gancho;
    ...

    public void usuarioClicouNoBotaoDeAdicionarProduto() {
        // lógica para salvar produto
        gancho.produtoFoiInserido();
    }
}

Tudo que falta é você amarrar a tela principal à tela cadastro produto. É só vc setar a propriedade na hora que você criar a tela de cadastro, na tela principal, assim:

public void clicouNoBotaoDeAbrirTelaDeCadastro() {
    TelaCadastroProduto tcp = new TelaCadastroProduto();
    tcp.setGancho(this);
    // lógica pra exibir o JFrame na tela
}

Eu conheço bem pouco de Swing em si, mas é uma forma de se implementar interfaces de usuário no geral. Os eventos da UI servem pra outras coisas. Espero que ajude!

Se quiser saber mais sobre isso, procure sobre o padrão de projeto Delegate, é bastante usado no iOS para fazer ganchos entre componentes, tanto visuais quanto internos.

Dicas:

  1. Outra maneira de setar o gancho é no construtor (o que eu acho melhor), mas depende do caso. Se o gancho não for obrigatório, pode deixar no setter mesmo, mas aí na hora de chamar gancho.produtoFoiInserido(); você antes verifica se o gancho não é null.

  2. Para melhorar a performance da aplicação, você pode (e deve) utilizar multi-threading para buscar as informações no banco de dados. É um assunto mais complexo, mas vale a pena aprender.

C
quanto ao ao deletar o código é com banco de dados Tenho uma classe tabela que organiza pra mim

public class Tabela  extends AbstractTableModel{

private int numLinhas;

private ArrayList<String[]> dados;

private ResultSetMetaData rsmd;

private static final String[] titulo =

{codigo,Cód. Barras,Descrição,Valor Unitário,Quantidade,Valor Total};
public String getColumnName(int qtdcolunas){
return titulo[qtdcolunas];
}
public Tabela(ResultSet rs) throws SQLException{
setRs(rs);

}

public void setRs(ResultSet rs) throws SQLException{

dados = new ArrayList<String[]>();

while(rs.next()){

String[] linha ={

rs.getString(codigo),

rs.getString(codbarras),

rs.getString(descricao_produto),

rs.getString(valor_unitario),

rs.getString(quantidade),

rs.getString(valor_total)};

dados.add(linha);

}

fireTableStructureChanged();

fireTableDataChanged();
}
@Override
public int getRowCount(){

return dados.size();

}

<a class="mention" href="/u/override">@Override</a>

public int getColumnCount(){

return titulo.length;

}

<a class="mention" href="/u/override">@Override</a>

public Object getValueAt(int rowIndex, int columnIndex){

String[] linha = dados.get(rowIndex);

return linha[columnIndex];

}

public void deletarLinha(int linha){

dados.remove(linha);

fireTableRowsDeleted(linha, linha);

}

public void atualizaTabela(){

fireTableDataChanged();

}

}

No frame da tabela onde exclui

private void jbExcluirActionPerformed(java.awt.event.ActionEvent evt) {

int opcao_escolhida = JOptionPane.showConfirmDialog(this,Exclusão,Confirma Exclusão,JOptionPane.YES_NO_OPTION);

if(opcao_escolhida ==JOptionPane.YES_OPTION)

try {

salvarExcluidos();//aqui ele salva o produto selecionado jogando para outra tabela

String delete = delete from gs_vendas where codigo=’”+codigodalinha+"’;";

conx.stm.executeUpdate(delete);

tabela.deletarLinha(jProdutos.getSelectedRow());

JOptionPane.showMessageDialog(null,Excluido com sucesso);

}catch (SQLException ex) {

JOptionPane.showMessageDialog(null, ex);

}

}

Esse código da linha é uma gamb para pegar o codigo da linha selecionada

private void jProdutosMouseClicked(java.awt.event.MouseEvent evt) {

codigodalinha =(String) tabela.getValueAt(jProdutos.getSelectedRow(), 0);
Quando a atualização da tabela eu não sei como poderia fazer porque estou totalmente amarrada a ele quer dizer eu  tentei fazer de tudo, mas dessa forma que voce falou ainda não, porque ali na hora o que eu puxo são dois metodos(slá se são metodos que fala)

que são esses :

public void mostrarProdTabela(){

try {

conx.executaSQL(select codigo,descricao_produto,codbarras,venda_tabela,to_char(valor_unitario, 9999D99) as valor_unitario,to_char(valor_total, 9999D99) as valor_total, to_char(quantidade, 9999D99)as quantidade from gs_vendas where venda_tabela=+jtPedido.getText()+";");

tabela = new Tabela(<a href="http://conx.rs">conx.rs</a>);

jProdutos.setModel(tabela);

} catch (SQLException ex) {

Logger.getLogger(VendaNew.class.getName()).log(Level.SEVERE, null, ex);

}

}

public void Incluiprodtabela(){

try {

conx.executaSQL(update gs_cab_vendas set valor_venda=(select sum(valor_total) as valores from gs_vendas where venda_tabela=+jtPedido.getText()+") where codigo="+jtPedido.getText()+";");

conx.executaSQL(select valor_venda from gs_cab_vendas where codigo=+jtPedido.getText()+";");

conx.rs.first();
jlValortotal.setText(conx.rs.getString("valor_venda"));
        
        Double valorVenda = Double.parseDouble(jlValortotal.getText());
        Double valorDesconto = Double.parseDouble(jlDesconto.getText());
        jlTotal.setText(String.valueOf(String.format("%.2f",(valorVenda-valorDesconto))));
    } catch (SQLException ex) {
        Logger.getLogger(VendaNew.class.getName()).log(Level.SEVERE, null, ex);
    }
 }
L

Aí você quebra minhas pernas kkkkkk. Vou ser bem sincero contigo.

  1. Se você tem pressa para entregar isso para alguém, me desculpe mas eu não vou poder te ajudar. Infelizmente eu não vou conseguir entender teu código sem gastar um bom tempo pensando, copiar pra minha IDE e tentar pra ver no que dá. Provavelmente mais alguém aqui do fórum vai poder te responder bem melhor do que eu (isso deve acontecer logo, no máximo algumas horas). A lógica está extremamente espalhada por vários lugares. Se fosse eu, iria tentar remodelar o sistema e tentar aumentar a coesão dos componentes (cada componente com uma função única), de forma que os problemas pudessem ser resolvidos de forma mais focada, de preferência em uma única classe.

  2. Se você tá só estudando, aqui vai meu conselho: pelo que eu entendi, você tá tentando domar duas feras ao mesmo tempo: Swing e JDBC. Além disso, também tem a questão de design (de sistema, não visual). Antes de tentar juntar isso tudo, tente estudar cada uma um pouco mais a fundo de forma isolada. Faz pequenos códigos dentro do public static void main mesmo, vai investigando e vendo o que acontece. Cria UIs pequenas (só um botão e uma label) e janelas que se comunicam entre si para fazer coisas mais simples. Depois disso, integrar as duas tecnologias vai ser extremamente simples.

Meu avô sempre dizia: Quem canta não assobia!

C

UHAUHSUAHSA, Entendi, bom eu tenho um pouco de pressa porque até já implantei no cliente porém tenho que arrumar isso, bom por mim ficava assim do jeito que está KKK, mas obrigada vou ver se alguem tem uma solução de imetiada pra mim, e depois vou organizando com calma cada coisa.

C

Consegui Atualizar puxando as informações os jtextfield pro mesmo jframe (instanciando eles) e agora vou ver a questão de excluir

C
Solucao aceita

Resolvido os problemas de Atualizar e Excluir os produtos. consegui com um video e com um topico aqui do GUJ mesmo a parte de excluir

Criado 31 de janeiro de 2017
Ultima resposta 15 de fev. de 2017
Respostas 6
Participantes 2