Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    35

    [Java/Swing]Cambiamenti in una JTable

    Ciao a tutti!

    Sto implementando una JTable in cui l'utente dovrà inserire i dati nelle celle,inizializzate come null.

    Il mio modello personalizzato di tabella implementa il TableModelListener e il metodo tableChanged dovrebbe rilevare i cambiamenti e memorizzarli nel mio array dati(che ovviamente contiene i dati della tabella,quindi inizialmente tutti null.)

    class MyTableModel extends AbstractTableModel implements TableModelListener


    public void tableChanged(TableModelEvent t) {

    int row = t.getFirstRow();
    int column = t.getColumn();
    TableModel model = (TableModel) t.getSource();
    dati[row][column] = model.getValueAt(row, column);

    }


    Non riesco a capire però perchè,pur non essendoci errori in fase di compilazione,questa cosa non funziona.Probabilmente non ho capito bene come funziona il metodo associato al TableListener.

    Grazie in anticipo per l'eventuale aiuto.

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

    Re: [Java/Swing]Cambiamenti in una JTable

    Originariamente inviato da Matrix86
    Il mio modello personalizzato di tabella implementa il TableModelListener e il metodo tableChanged dovrebbe rilevare i cambiamenti e memorizzarli nel mio array dati(che ovviamente contiene i dati della tabella,quindi inizialmente tutti null.)
    No, approccio sbagliato. Il table model non deve implementare TableModelListener. Visto che hai esteso AbstractTableModel, allora la gestione della struttura dati è a tuo carico. E devi implementare i metodi per "esporre" le informazioni sul modello (getRowCount(), getColumnCount(), isCellEditable(), getValueAt() ecc...) e se vuoi che il modello sia modificabile, pure setValueAt(). Ed è quest'ultimo che devi implementare se vuoi che quando l'utente scrive in una cella editabile, il valore venga poi scritto nella tua struttura dati. E non solo devi aggiornare fisicamente la tua struttura dati ma anche fare un fireTableCellUpdated() per notificare gli eventuali listener della modifica della cella.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    35
    Tutti i metodi che mi hai citato fano parte della mia classe però in alcuni casi ho utilizzato quelli preimpostati sul sito della Sun..

    Il metodo che crea problemi dovrebbe questo quindi?

    public void setValueAt(Object value, int row, int col) {
    if (DEBUG) {
    System.out.println("Setting value at " + row + "," + col
    + " to " + value
    + " (an instance of "
    + value.getClass() + ")");
    }

    dati[row][col] = value;
    fireTableCellUpdated(row, col);

    if (DEBUG) {
    System.out.println("New value of data:");
    printDebugData();
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Matrix86
    Il metodo che crea problemi dovrebbe questo quindi?
    A parte i print di debug, ovviamente non so come hai gestito la tua struttura dati. Se quel 'dati' è un Object[][] e la cella fisicamente esiste a [row][col], l'assegnazione e il fire dell'evento sono corretti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    35
    Forse è proprio il fire che mi manca allora..

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    35
    Il mio problema è che voglio salvare il contenuto di una tabella di un file e utilizzo per farlo il seguente codice(sarebbe una parte del metodo che implemente l'ActionListener del JButton "Save Table"..

    Questa parte legge da un file i nomi delle colonne e li salva nel file in cui voglio ricapitolare i dati della tabella,e fin qui ok..

    if("SaveTable".equals(e.getActionCommand())){

    ArrayList<String> ColumnList = new ArrayList();
    String str="0";
    try{
    BufferedReader ColumnReader = new BufferedReader(new FileReader("C:/Users/Ste/workspace/Valuation_Of_Alternative_Architecture/src/Screen/ColonneJTable.txt"));

    str=ColumnReader.readLine();

    while(str!=null){
    ColumnList.add(str);
    str=ColumnReader.readLine();}

    }catch (FileNotFoundException fileNotFoundException){System.err.println("File cannot be found");}
    catch (IOException exc){}

    Qui invece leggo il numero di righe della tabella da un altro file :

    int n=0;

    try{
    BufferedReader RowReader = new BufferedReader(new FileReader("C:/Users/Ste/workspace/Valuation_Of_Alternative_Architecture/src/Screen/RigheJTable.txt"));
    String s=RowReader.readLine();

    n = Integer.valueOf(s).intValue();

    }catch (FileNotFoundException fileNotFoundException){System.err.println("File cannot be found");}
    catch (IOException exc){}

    Il problema sorge da qui in poi..Quando tento di accedere ai dati della tabella attraverso il table.getValueAt mi dà errore di compilazione,quindi io ho dedotto che probabilmente non funzionava l'ActionListener associato al JTable..

    try {
    FileOutputStream file = new FileOutputStream("C:/Users/Ste/workspace/Valuation_Of_Alternative_Architecture/src/Screen/Tabella.txt");
    PrintStream Output = new PrintStream(file);
    for(int i=0;i<ColumnList.size();i++)
    Output.printf("%s ", ColumnList.get(i));

    Output.printf(" \n");

    for(int i=1;i<=ColumnList.size();i++)
    for(int j=1;j<=n;j++)
    {
    Output.printf("%s" ,table.getValueAt(i, j).toString());
    if(j==n)Output.printf("\n");}

    Output.printf("Fine scrittura");

    } catch (IOException exc) {
    System.out.println("Errore: " + e);}

    System.out.println("File salvato");


    }


    Mi rendo conto che è un pò lunghetto come post,se hai tempo e voglia di darmi una mano te ne sarei grato..Altrimenti no problem..

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.