Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Java: Cancellazione righe da JTable

    Ciao a tutti,
    sto lavorando su una Jtable.
    ho relizzato un JPopupMenù che cliccando col tasto destro su una riga della mia JTable mi apre un menù e in esso vi è un sottomenù che prevede la cancellazione della riga.

    Per la prima cancellazione va tutto a meraviglia, dalla seconda cancellazione in poi il sistema conincia a dare i numeri, comincia a cancellarmi 2 righe alla terza me ne cancella tre fino a quando ovviamente il sistema mi ritonerà un ArrayIndexOutOfBoundsException (ovviamente aggiungo io).

    vi invio parte di codice per relizzare la cancellazione

    codice:
    //GuiFrame showPopup Method
    
    private void showPopup(MouseEvent me) {
    	if (pm.isPopupTrigger(me)) {
    		java.awt.Point p = me.getPoint();
    		int rowToDelete = jTable1.rowAtPoint(p);
    
    		//potrei anche cancellare l'if ma per adesso lo mantengo
    		if (rowToDelete != -1) {
                           //JPopupMenu
    			pm.show(jTable1, p.x, p.y); 
    			//JMenuItem
                            one.addActionListener(new PopupListener(tableModel, rowToDelete));
    		
    	
    			}
    		}
    	}



    codice:
    //PopupListener
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class PopupListener implements ActionListener {
    	private DefaultTableModel1 model;
    	private int riga;
    	
    	public PopupListener(DefaultTableModel1 model, int riga){
    		this.model=model;
    		this.riga=riga;
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {		
    		model.removeRow(riga);
    		 
    	}
    }

    Come mai mi succede questo?
    Avevo provato anche a usare la SwingUtilities ma il problema rimane.

    Grazie per ogni aiuto/consiglio.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tutta la gestione risiede nel TableModel.
    Questo è lo stralcio di un metodo di un TableModel che effettua la cancellazione di una riga:

    codice:
    public void removeRow(int idx) {
       dati.remove( idx );
       fireTableRowsDeleted(idx, idx);
    }
    Il TableModel in questione mantiene l'elenco dei dati all'interno di un ArrayList chiamato "dati".
    "idx" è l'indice della riga da rimuovere.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ho già provato con questo metodo
    codice:
    public void actionPerformed(ActionEvent arg0) {
    
    	model.removeRow(riga);
            model.fireTableRowsDeleted(riga, riga);
            model.fireTableDataChanged();      
    }
    ma non cambia nulla....anche aggiungendo il model.fireTableDataChanged().
    Devo fare l'override del metodo fireTableRowsDeleted nel TableModel?

    Grazie,
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    non capisco perché quando vado a fare il debug vedo che l'actionPerformed viene chiamato più volte (in maniera crescente) ed è questo che mi crea il problema secondo me....
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Ho risolto.

    Il problema è che l'addActionListener veniva chiamato ogni volta che mi doveva mostrare il popup.
    Così ho spostato l'addActionListener nel metodo dove viene costruita la tabella e li stesso con l'anonymous inner class ho gestito il processo di cancellazione.

    Grazie ugualmente per l'aiuto

    Ciao
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.