Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211

    [JAVA] JTable come si cancella una riga?

    Ciao gente, ho una JTable con il suo TableModel creato ad hoc da me.
    Il TableModel implementa la classe AbstractTableModel e io ho aggiunto un metodo removeRow(int r) che cancella un 'record' dalla struttura dati interna e poi chiama il metodo fireTableRowsDeleted(row,row); che dovrebbe in teoria fare il refresh della JTable.

    La riga viene cancellata dalla struttura sottostante (lo vedo perchè la salvo su disco), ma a video la JTable non cambia

    Qualche suggerimento?
    Grazie
    ghinz

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    prova a usare fireTableChanged(TableModelEvent e)
    cmq con updateUI() dovrebbe repaintarla

  3. #3
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Originariamente inviato da floyd
    prova a usare fireTableChanged(TableModelEvent e)
    cmq con updateUI() dovrebbe repaintarla
    Grazie floyd, le sto provando un po' tutte, ma qui non si aggiorna niente.
    Col fireTableChanged non funzia.
    Con updateUI in effetti la tabella viene ridisegnata, ma senza le righe aggiunte/tolte... Mi sta passando la voglia...
    ghinz

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    ho un dubbio, posta il codice con cui rimuovi la riga

  5. #5

    per curiosità

    hai provato ad usare:
    tableModel.fireTableDataChanged();

  6. #6
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211

    Re: per curiosità

    Originariamente inviato da dr.m0nst3r
    hai provato ad usare:
    tableModel.fireTableDataChanged();
    Ciao, si ho provato, ma non succede niente

    Premetto che il problema è senz'altro dovuto alla mia scarsa esperienza con questo oggetto, quindi avrò senz'altro combinato qualcosa di strano nello scrivere il programma.

    Per floyd: ti posto qui sotto un po' di codice, considera che la jtable visualizza degli oggetti "Scadenza" che si trovano in una classe contenitore "elenco". Il jframe contiene la jtable e alcuni pulsanti per aggiungere/togliere gli oggetti dall'elenco.
    quando premo "aggiungi" viene creata una nuova istanza di un oggetto scadenza che viene passato come parametro ad un apposito JDialog dove l'utente setta i suoi valori. Quando premere ok nel dialog, viene sparato un evento di "nuova scadenza creata" che il frame intercetta ed in base al quale dovrebbe aggiornarsi.
    Spero che si sia capito qualcosa...

    JButton per cancellare una riga
    private void cmdDeleteActionPerformed(java.awt.event.ActionEven t evt) {
    try {
    int ret = JOptionPane.showConfirmDialog(this,"Sicuro di cancellare la scadenza selezionata?");
    if (ret==JOptionPane.YES_OPTION) {
    // --- cancello la scadenza (estm è il tablemodel)
    estm.removeRow(tblScadenze.getSelectedRow());
    }
    }
    catch (Exception ex) {
    JOptionPane.showMessageDialog(this,ex.toString());
    }
    }

    Metodo del tablemodel per cancellare una scadenza dalla lista
    /**
    * Rimuove la riga indicata e con essa l'oggetto scadenza dall'elenco.
    */
    public void removeRow(int row) {
    if (row>=getRowCount() || row<0) {
    System.out.println("Riga " + row + " fuori range.");
    }
    try {
    elenco.rimuoviScadenza(getScadenzaAtRow(row));
    fireTableRowsDeleted(row,row);
    System.out.println("Riga cancellata");
    }
    catch (Exception ex) {
    ex.printStackTrace();
    }
    }

    Pulsante per l'aggiunta di una scadenza
    private void cmdAddActionPerformed(java.awt.event.ActionEvent evt) {
    // --- Creo una nuova scadenza
    Scadenza s = new Scadenza(
    "Nuova scadenza",
    "Descrizione",
    new java.util.Date(),
    null
    );
    ScadenzaDialog sd = new ScadenzaDialog(
    this,
    true,
    Scadenza.FLAG_NUOVA_SCADENZA,
    s,
    elenco.getDeperibili()
    );
    sd.addScadEventListener(this);
    sd.show(true);
    }

    Gestore eventi
    /**
    * Reagisce agli eventi lanciati dai dialog box quando si modificano le
    * scadenze (aggiorna la tabella).

    * Metodo dell'interfaccia ScadEventListener
    */
    public void eventPerformed(ScadEvent ev) {
    int tipo = ev.getTipo();
    switch (tipo) {
    case (ScadEvent.SCADENZA_CHANGED): {
    ordinaTabella();
    break;
    }
    case (ScadEvent.SCADENZA_NEW): {
    // --- aggiungo una scadenza all'elenco
    try {
    Object obj = ev.getSource();
    if (obj instanceof Scadenza) {
    Scadenza s = (Scadenza)obj;
    elenco.aggiungiScadenza(s);
    TableModelEvent tme = new TableModelEvent(
    tblScadenze.getModel(),
    0,
    elenco.getChildren().size()-1,
    TableModelEvent.INSERT
    );
    estm.fireTableChanged(tme);
    //estm.fireTableRowsInserted(0,estm.getRowCount());
    //tblScadenze.getUI().update(tblScadenze.getGraphics (),tblScadenze);
    //tblScadenze.update(tblScadenze.getGraphics());
    //tblScadenze.updateUI();
    }
    }
    catch (Exception ex) {
    System.out.println(ex.toString());
    }
    ordinaTabella();
    break;
    }
    case (ScadEvent.SCADENZA_DELETED): {
    try {
    Object obj = ev.getSource();
    if (obj instanceof Scadenza) {
    Scadenza s = (Scadenza)obj;
    elenco.rimuoviScadenza(s);
    }
    }
    catch (Exception ex) {
    }
    ordinaTabella();
    break;
    }
    }
    }

    Grazie della disponibilità!
    ghinz

  7. #7
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    ciò che volevo vedere è come istanzi estm, nel momento della creazione della tabella e quando scateni l'evento di rimozione

  8. #8
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Ok ragazzi ho risolto!
    Avevo fatto un errore io nel tablemodel, cancellavo il record nella mia struttura dati principale e non nella lista dalla quale il tablemodel prende i valori.
    Eehhh la vecchiaia avanza...

    Grazie ancora per la vostra disponibilità
    ghinz

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 © 2024 vBulletin Solutions, Inc. All rights reserved.