Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30

    Problema a cancellare una riga JTable e salvarla su file

    Ciao a tutti,

    ho un piccolo problema relativo ad una programma che gestisce una rubrica telefonica mediante un'interfaccia grafica. Ho svolto tutte le funzionalità (Bottone Apri: permette all'utente di scegliere un file, Bottone Salva sovrascrive le modifiche effettuate, Bottoni Avanti - Indietro scorrono la rubrica, Bottone Nuovo crea un nuovo contatto in coda, e Bottone Delete elimina un contatto esistente.

    Il mio problema è proprio nella funzionalità del Bottone Elimina in quanto mi cancella il contatto sucessivo rispetto a quello che voglio eliminare e non sono riuscito a trovare una soluzione. Vi posto le parti di codice interessate:

    codice:
    deleteAct=new AbstractAction("Delete"){
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    				
    			int rowToDelete=(rv.getTab().getSelectedRow());	
    			System.out.println("rowToDelete"+rowToDelete);
    			rm.removeSchedaAt(rv.getTfName().getText(),  rv.getTfSurname().getText(), rv.getTfTelephone().getText(), rv.getTfEmail().getText(),(rowToDelete+1));
    			rv.getLabError().setText("Contact deleted");
    			
    		}
    		
    	};

    codice:
    public class RubricaModel extends AbstractTableModel{
    
    	private ArrayList<Scheda> schede;
    	
    	public RubricaModel() {
    		schede=new ArrayList<Scheda>();
    	}
    	
    	
    	public void removeSchedaAt(String name,String surname,String telephone,String email, int i){
    		
    		schede.remove(i);
    		
    		fireTableRowsDeleted(i,i);
    	}
    	
    	public void save(String name, String surname, String telephone, String email) throws IOException{
    
    		Scheda s;
    		PrintWriter pw;
    		Iterator<Scheda> it=schede.iterator();
    
    		pw = new PrintWriter(new FileWriter("rubrica.txt"));
    	
    			while(it.hasNext()){
    				s = it.next();
    				if(s.getEmail().equalsIgnoreCase("") || s.getEmail().equalsIgnoreCase("(opzionale)")){
    					pw.println(s.getName() + "," + s.getSurname() + "," + s.getTelephone());}
    				else {
    					pw.println(s.getName() + "," + s.getSurname() + "," + s.getTelephone() + "," + s.getEmail());
    				}
    			}
    			pw.close();
    		
    	}
    
    	public void aggiornaScheda(String name, String surname, String telephone, String email, int current){
    		
    		schede.get(current).setName(name);
    		schede.get(current).setSurname(surname);
    		schede.get(current).setTelephone(telephone);
    		schede.get(current).setEmail(email);
    
    	}
    
    	public ArrayList<Scheda> getSchede() {
    		return schede;
    	}
    
    	@Override
    	public int getColumnCount() {	
    		return 4;
    	}
    
    	@Override
    	public int getRowCount() {
    		return schede.size();
    	}
    
    	@Override
    	public Object getValueAt(int r, int c) {
    		String field=null;
    		Scheda s=schede.get(r);
    		
    		if(s!=null){
    			switch(c){
    			case 0:
    				field=s.getName();
    				break;
    			case 1:
    				field=s.getSurname();
    				break;
    			case 2:
    				field=s.getTelephone();
    				break;
    			case 3:
    				field=s.getEmail();
    				break;
    			default:
    				break;
    			}
    		}
    		return field;
    	}

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    Ragazzi proprio nessuno che sa darmi un aiutino??

  3. #3
    Non è che vi voglia un'arca di scienza per capire cosa succede:
    codice:
    rm.removeSchedaAt(rv.getTfName().getText(),  rv.getTfSurname().getText(), rv.getTfTelephone().getText(), rv.getTfEmail().getText(),(rowToDelete+1));
    
    
    public void removeSchedaAt(String name,String surname,String telephone,String email, int i){
    		
    		schede.remove(i);
    		
    		fireTableRowsDeleted(i,i);
    	}
    Perchè richiami il remove di "rowToDelete+1" ?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    L'ho messo per provare e poi caricandolo qui mi sono dimenticato di toglierlo. L'ho fatto perchè se togli il +1 ma metti solo rowToDelete lancia un'eccezione:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(ArrayList.java:324)
    at RubricaModel.getValueAt(RubricaModel.java:90)
    at RubricaModel.getName(RubricaModel.java:116)
    at RubricaView.updateFields(RubricaView.java:151)
    at RubricaView.valueChanged(RubricaView.java:139).... ...
    e se clicco per vedere dov'è l'errore me lo da qui:

    public Object getValueAt(int r, int c) {
    String field=null;
    Scheda s=schede.get(r); <----evidenzia questa riga

    if(s!=null){
    switch(c){
    case 0:
    field=s.getName();
    break;
    case 1:
    field=s.getSurname();
    break;
    case 2:
    field=s.getTelephone();
    break;
    case 3:
    field=s.getEmail();
    break;
    default:
    break;
    }
    }
    return field;
    }

  5. #5
    Come da documentazione il metodo getSelectRow ritorna -1 quando non è selezionata nessuna riga.
    Quindi ovviamente se lo richiami senza aver selezionato una riga si verifica l'eccezione da te postata.
    Risoluzione, aggiungi un controllo per sapere se effettivamente esiste una riga selezionata.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    All'interno dell'azione Delete ho messo una stampa che mi dice che riga vado a stampare

    codice:
    deleteAct=new AbstractAction("Delete"){
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    				
    			int rowToDelete=(rv.getTab().getSelectedRow());	//memorizzo il numero di riga da cancellare 
    			
    			System.out.println("rowToDelete"+ rowToDelete);   <------
    			if(rm.getSchede().size()==1){
    				empty();
    		}
    			rm.removeSchedaAt(rowToDelete);
    			rv.getLabError().setText("Contact deleted");
    			
    		}
    		
    	};
    Infatti se apro la rubrica seleziono il 3 contatto e clicco delete mi stampa rowToDelete 2 (dato che per contare lui parte da 0).
    Ho fatto delle prove:
    1) se metto int rowToDelete=(rv.getTab().getSelectedRow()+1) mi cancella la riga sucessiva a quella che vorrei cancellare
    2)se metto int rowToDelete=(rv.getTab().getSelectedRow()-1) mi cancella la riga precedente.
    Quindi funziona secondo me..
    Il Se non metto nulla mi da errore! Come mai?
    Grazie

  7. #7
    Io ancora devo capire come la mente umana ragioni....
    Infatti se apro la rubrica seleziono il 3 contatto e clicco delete mi stampa rowToDelete 2 (dato che per contare lui parte da 0).
    Perfetto è se passi rowToDelete al tuo metodo ti dovrebbe cancellare il 2 contatto.
    Il Se non metto nulla mi da errore! Come mai?
    Posta magari tutto lo stacktrace.... mi da errore vuol dire tutto e non vuol dire niente.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    Ecco l'errore:

    rowToDelete2
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(ArrayList.java:324)
    at RubricaModel.getValueAt(RubricaModel.java:91)
    at RubricaModel.getName(RubricaModel.java:117)
    at RubricaView.updateFields(RubricaView.java:154)
    at RubricaView.valueChanged(RubricaView.java:142)
    at javax.swing.DefaultListSelectionModel.fireValueCha nged(DefaultListSelectionModel.java:167)
    at javax.swing.DefaultListSelectionModel.fireValueCha nged(DefaultListSelectionModel.java:147)
    at javax.swing.DefaultListSelectionModel.fireValueCha nged(DefaultListSelectionModel.java:194)
    at javax.swing.DefaultListSelectionModel.removeIndexI nterval(DefaultListSelectionModel.java:660)
    at javax.swing.JTable.tableRowsDeleted(JTable.java:44 97)
    at javax.swing.JTable.tableChanged(JTable.java:4400)
    at javax.swing.table.AbstractTableModel.fireTableChan ged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableRows Deleted(AbstractTableModel.java:245)
    at RubricaModel.removeSchedaAt(RubricaModel.java:39)
    at RubricaController$2.actionPerformed(RubricaControl ler.java:65)
    at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.jav a:6375)
    at javax.swing.JComponent.processMouseEvent(JComponen t.java:3267)
    at java.awt.Component.processEvent(Component.java:614 0)
    at java.awt.Container.processEvent(Container.java:208 3)
    at java.awt.Component.dispatchEventImpl(Component.jav a:4737)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2141)
    at java.awt.Component.dispatchEvent(Component.java:45 65)
    at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4619)
    at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4280)
    at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4210)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2127)
    at java.awt.Window.dispatchEventImpl(Window.java:2482 )
    at java.awt.Component.dispatchEvent(Component.java:45 65)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:684)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:643)
    at java.awt.EventQueue$1.run(EventQueue.java:641)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:657)
    at java.awt.EventQueue$2.run(EventQueue.java:655)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java: 654)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:122)

  9. #9
    Infatti quello che supponevo anche se rowToDelete è 2 al model arriva -2 ed è quello il problema. Dal codice postato non si sa nulla di quel model.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    Ah ok..grazie mille per avermi

    public class RubricaModel extends AbstractTableModel{

    private ArrayList<Scheda> schede;

    public RubricaModel() {
    schede=new ArrayList<Scheda>();
    }

    public void addScheda(String name,String surname,String telephone,String email) throws Exception{ //aggiunge una scheda in coda
    Scheda s=new Scheda(name,surname,telephone,email);

    schede.add(s);
    fireTableRowsInserted(schede.size()-1,schede.size()-1); //notifica tutti i listener che la tabella ha subito delle modifiche e che è stata inserita la riga nel range(x,y)
    }

    public void addSchedaAt(String name,String surname,String telephone,String email, int i) throws Exception{ //aggiunge una scheda in una determinata posizione
    Scheda s=new Scheda(name,surname,telephone,email);

    schede.add(i, s);
    fireTableRowsInserted(i, i);
    }

    public void setSchedaAt(String name,String surname,String telephone,String email,int i) throws Exception{
    Scheda s=new Scheda(name,surname,telephone,email);
    schede.add(i, s);
    fireTableRowsUpdated(i,i);
    }

    public Scheda removeSchedaAt(int i){
    Scheda sch=schede.remove(i);
    fireTableRowsDeleted(i,i);
    return sch;


    }

    public void save(String name, String surname, String telephone, String email) throws IOException{

    Scheda s;
    PrintWriter pw;
    Iterator<Scheda> it=schede.iterator();

    pw = new PrintWriter(new FileWriter("rubrica.txt"));

    while(it.hasNext()){
    s = it.next();
    if(s.getEmail().equalsIgnoreCase("") || s.getEmail().equalsIgnoreCase("(opzionale)")){
    pw.println(s.getName() + "," + s.getSurname() + "," + s.getTelephone());}
    else {
    pw.println(s.getName() + "," + s.getSurname() + "," + s.getTelephone() + "," + s.getEmail());
    }
    }
    pw.close();

    }

    public void aggiornaScheda(String name, String surname, String telephone, String email, int current){

    schede.get(current).setName(name);
    schede.get(current).setSurname(surname);
    schede.get(current).setTelephone(telephone);
    schede.get(current).setEmail(email);

    }

    public ArrayList<Scheda> getSchede() {
    return schede;
    }

    @Override
    public int getColumnCount() {
    return 4;
    }

    @Override
    public int getRowCount() {
    return schede.size();
    }

    @Override
    public Object getValueAt(int r, int c) {
    String field=null;
    Scheda s=schede.get(r);

    if(s!=null){
    switch(c){
    case 0:
    field=s.getName();
    break;
    case 1:
    field=s.getSurname();
    break;
    case 2:
    field=s.getTelephone();
    break;
    case 3:
    field=s.getEmail();
    break;
    default:
    break;
    }
    }
    return field;
    }



    public String getName(int i){
    return (String)getValueAt(i,0);
    }

    public String getSurname(int i){
    return (String)getValueAt(i,1);
    }

    public String getTelephone(int i){
    return (String)getValueAt(i,2);
    }

    public String getEmail(int i){
    return (String)getValueAt(i,3);
    }

    public String getColumnName(int c){
    return Scheda.intestazione[c];
    }



    }

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.