Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    50

    metodo getValueAt ed ArrayIndexOutOfBoundsException

    A volte il metodo getValueAt(int row, int col) della classe AbstractTableModel, genera un eccezione del tipo:

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
    at it.ssi.adtf.gui.components.Adtf_UsbMediaListTableT ableModel.getValueAt(Adtf_UsbMediaListTableTableMo del.java:74)

    che però non riesco a riprodurre sistematicamente.
    A cosa è dovuto?


    Grazie
    frapal

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

    Re: metodo getValueAt ed ArrayIndexOutOfBoundsException

    Originariamente inviato da frapal
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
    at it.ssi.adtf.gui.components.Adtf_UsbMediaListTableT ableModel.getValueAt(Adtf_UsbMediaListTableTableMo del.java:74)

    A cosa è dovuto?
    Innanzitutto chi l'ha fatta la classe it.ssi.adtf.gui.components.Adtf_UsbMediaListTableT ableModel??? Tu?

    Le questioni comunque sono due: a) Come è implementato il model e b) chi invoca il getValueAt().

    Il model dovrebbe essere implementato in modo che ci sia "consistenza" tra la struttura dati e quanto ritornato da getRowCount e getColumnCount. Se il model dice che ci sono es. 5 colonne, è chiaro che il getValueAt non dovrebbe lanciare alcuna eccezione che segnala un "out of bound" se la colonna è tra 0 e 4. Se invece succede, allora è il model che è "fallato".

    Poi bisogna vedere chi invoca getValueAt(). Tipicamente è il codice di gestione di JTable che lo invoca (e fintanto che c'è consistenza come detto sopra, non dovrebbe fallire) ma puoi invocarlo anche tu esplicitamente. Ed è chiaro che se tu ti aspetti che ci sia es. la colonna 6 mentre invece al massimo c'è la colonna 5.... il problema diventa tuo.
    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
    Oct 2009
    Messaggi
    50
    Confermo che la classe la classe it.ssi.adtf.gui.components.Adtf_UsbMediaListTableT ableModel l'ho fatta io (Il codice a fine messaggio).
    Mettendo delle System.out.println nei metodi
    getColumnCount e getRowCount ho notato che vengono chiamati molte volte ma di fatto io esplicitamente non li chiamo mai.
    Quando vengono invocati tali metodi?

    public class Adtf_UsbMediaListTableTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;
    private String[] columnNames = {"USB Microcode", "Label", "USB Media Identifier (UMI)", "Mount Point", "Size (GB)", "Free Space (GB)", "Mounted on"};
    private Object[][] data = null;

    /**
    * Constructor
    * @param pUsbMediaList Map<String, Adtf_UsbDevice> to display
    */
    public Adtf_UsbMediaListTableTableModel(final Vector<UsbDevice> pUsbMediaList)
    {
    Date mountingDate;
    data = new Object[pUsbMediaList.size()][7];

    for (int i = 0;i<pUsbMediaList.size();i++)
    {
    data[i][0]=pUsbMediaList.get(i).getMicrocode();
    data[i][1]=pUsbMediaList.get(i).getLabel();
    data[i][2]=pUsbMediaList.get(i).getUmi();
    data[i][3]=pUsbMediaList.get(i).getMountPoint();
    data[i][4]=pUsbMediaList.get(i).getMediaSize();
    data[i][5]=pUsbMediaList.get(i).getFreeSpace();

    mountingDate= pUsbMediaList.get(i).getTimeMounting();
    if (null==mountingDate)
    data[i][6]="";
    else
    data[i][6] = Adtf_Utility.convertDateIntoCustomFormat(mountingD ate,"yyyy-MM-dd HH:mm:ss");
    }
    }

    /**
    * override the getColumnCount method
    */
    public int getColumnCount() {
    return columnNames.length;
    }

    /**
    * Override the getRowCount
    */
    public int getRowCount() {
    return data.length;
    }

    /**
    * override the getColumnName method
    */
    public String getColumnName(int col) {
    return columnNames[col];
    }

    /**
    * override the getValueAt method
    */
    public Object getValueAt(int row, int col) {
    return data[row][col];
    }

    /**
    * override the isCellEditable method
    */
    public boolean isCellEditable(int row, int col) {
    return false;
    }

    public void removeRow(int i) {
    }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    50
    non c'è nessuno che potrebbe aiutarmi???
    HELP

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da frapal
    Quando vengono invocati tali metodi?
    In ogni momento in cui JTable deve ottenere le varie informazioni e i valori da passare a renderer/editor.

    La gestione mi pare corretta .... almeno a occhio. I valori ritornati dai vari getXxx sono perlomeno coerenti con la struttura dati.

    La struttura dati (l'array 'data') lo modifichi in seguito?? Vedo che hai messo un tuo removeRow(), anche se non ha codice dentro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    50
    In realtà ogni qual volta ho necessità di aggiornare il contenuto della tabella, chiamo una nuova new Adtf_UsbMediaListTableTableModel tableModel=new Adtf_UsbMediaListTableTableModel(xxx);
    dove xxx è il vettore con i nuovi dati.
    Il metodo removeRow() di fatto non viene mai utilizzato proprio perchè il meccanismo di refresh e quindi anche nel caso eventuale di row rimossa, viene gestito come ti ho poc'anzi spiegato.
    Pensi sia corretto?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da frapal
    Pensi sia corretto?
    Assegnare al JTable ogni volta un nuovo "modello" sì, tecnicamente è corretto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.