Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268

    ancora problemi con celle e Jtable

    Ciao a tutti, vengo subito al sodo:
    Ho una tabella con 6 colonne e 15 righe.
    tra cui km iniziali, km finali, km percorsi.
    l'utente immette i km finali, i km iniziali sono già visuliazzati.
    Quello che vorrei fare è che alla fine dell'immisione dei dati la colonna km percorsi venga valorizzata con il calcolo della differenza.
    le 15 righe delle colonne sono tutte editabili a discrezione dell'operatore, il mio problema è quello di catturare la riga e quindi la cella che è attiva per poter procedere al calcolo.
    la fine dell'evento di scrittura sulla cella pensavo di gestirlo con

    codice:
    editingStopping(Changeevent e)
    però non riesco a catturare la cella in cui l'utente stà scrivendo.
    Qualcuno mi può fare un esempio?

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: ancora problemi con celle e Jtable

    Originariamente inviato da X-mac
    Quello che vorrei fare è che alla fine dell'immisione dei dati la colonna km percorsi venga valorizzata con il calcolo della differenza.
    le 15 righe delle colonne sono tutte editabili a discrezione dell'operatore, il mio problema è quello di catturare la riga e quindi la cella che è attiva per poter procedere al calcolo.
    la fine dell'evento di scrittura sulla cella pensavo di gestirlo con

    codice:
    editingStopping(Changeevent e)
    però non riesco a catturare la cella in cui l'utente stà scrivendo.
    Le cose che puoi fare in modo "pulito" sono almeno 2:
    - Registrare sul table model un TableModelListener, così quando ricevi notifica che la/e cella/e interessata/e vengono aggiornate, fai qualcosa.
    - Lavorare a livello di table model (implementare un tuo table model estendendo AbstractTableModel o derivando uno già fatto come DefaultTableModel). In pratica basta sovrascrivere il setValueAt e se vedi che è la/e cella/e interessata/e, fai qualcosa.

    Come vedi, la questione è la stessa, solo il modo in cui si viene a sapere che "qualcosa" è cambiato è differente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    ho provato ad implementare un listener sulla tabella, ma non sono riuscito
    praticamente non riesco a registrare e ad associare il listener.
    puoi farmi un esempio concreto?
    inoltre non ho capito il comportamento degli object ho trovato questo codice:
    codice:
    import javax.swing.event.*;
    import javax.swing.table.TableModel;
    
    public class SimpleTableDemo ... implements TableModelListener {
        ...
        public SimpleTableDemo() {
            ...
            table.getModel().addTableModelListener(this);
            ...
        }
    
        public void tableChanged(TableModelEvent e) {
            int row = e.getFirstRow();
            int column = e.getColumn();
            TableModel model = (TableModel)e.getSource();
            String columnName = model.getColumnName(column);
            Object data = model.getValueAt(row, column);
    
            ...// Do something with the data...
        }
        ...
    }
    quando scrive
    codice:
    Object data = model.getValueAt(row, column);
    mi restituisce il valore della cella? quindi se il valore è string devo usare toString?
    Grazie dell'aiuto

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da X-mac
    codice:
        public void tableChanged(TableModelEvent e) {
            int row = e.getFirstRow();
            int column = e.getColumn();
            TableModel model = (TableModel)e.getSource();
            String columnName = model.getColumnName(column);
            Object data = model.getValueAt(row, column);
    
            ...// Do something with the data...
        }
        ...
    }
    Il punto è che dovresti fare dei test più "stretti" per verificare se è davvero su quella colonna che a te interessa. Quindi usare getColumn() per la colonna e getType() per verificare che sia un "UPDATE" (si presuppone che la riga ci sia già e quindi stai solo aggiornando un valore).
    E per sapere a quale riga, ti basta verificare se getFirstRow() e getLastRow() sono uguali (anche qui si presuppone che se hai appena "editato" una cella la riga è 1 sola!).

    Purtroppo "decodificare" informazioni precise dal TableModelEvent richiede una serie di test e non è immediato.

    Originariamente inviato da X-mac
    quando scrive
    codice:
    Object data = model.getValueAt(row, column);
    mi restituisce il valore della cella? quindi se il valore è string devo usare toString?
    Sì, come Object. Se tu "sai" di che tipo è (e dovresti saperlo) basta un cast. Anche un toString() in teoria, ma sarebbe troppo "radicale" a seconda di quale è il tipo e potrebbe non andare bene.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    ciao allora ho modificato il codice come segue
    codice:
    private void jTableMezziChanged(TableModelEvent e){                                           
             
             int row = e.getFirstRow();
            int column = e.getColumn();
            int type = e.getType();
            TableModel model = (TableModel)e.getSource();
            String columnName = model.getColumnName(column);
            Object data = model.getValueAt(row, column);
            if (type!=0 ){
            String s = data.toString();
            JTTarga.setText(s);
         }
    ho messo !=0 perchè non mi interessa nello specifico il tipo di evento, sia insert, update mi vanno bene lo stesso.
    quindi adesso ho gestito l'evento, in pratica ho scritto il metodo.
    Però come faccio ad implementare il listener? ho disegnato la tabella con netbenas e non capisco bene dove mettere il listener.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da X-mac
    ho messo !=0 perchè non mi interessa nello specifico il tipo di evento, sia insert, update mi vanno bene lo stesso.
    No, alt. Il valore 0 è proprio quello di TableModelEvent.UPDATE, quindi staresti escludendo gli UPDATE. Ti spiace guardare la documentazione javadoc??
    Allora se non ti interessa il tipo di evento ..... non testarlo nemmeno!

    Originariamente inviato da X-mac
    Però come faccio ad implementare il listener?
    Il listener è TableModelListener e ha 1 metodo ben preciso: tableChanged. Non jTableMezziChanged. Quest'ultimo (privato) è quello potrebbe generare un IDE, tipicamente invocato poi dal "vero" tableChanged che sempre l'IDE fa implementare da qualche parte.

    Ma è il concetto che devi capire ... non farti fare per forza le cose da un IDE (anzi .... semmai sarebbe da evitare). Il punto è che il TableModelListener va implementato in una classe e poi un oggetto di questa classe va passato al addTableModelListener. Punto, tutto qui.

    Ma quale classe esattamente .... a Swing non interessa quale sia, se una tua classe MioTableModelListener nello stesso package, in un package differente o ancora una regular inner class della tua classe principale o una anonymous inner class nel tuo costruttore o altro.

    Queste sono questioni di "design" e su questo un IDE non ti aiuta di certo. Devi avere già tu le idee chiare su queste questioni di "design" delle classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    non ci riesco, ho provato anche ad estendere la classe. ho letto la teoria ma non ci capisco niente. Riesci a farmi degli esempi?
    Grazie infinite

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.