Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Delete rows in JTable

  1. #1

    Delete rows in JTable

    Salve ragazzi. Avrei bisogno di un vostro aiuto. Ho implementato una JTable nella quale ho un JButton per ogni riga inserita. All'evento del pulsante voglio eliminare la riga stessa. Ho implementato l'apposito evento e in parte funziona, se non fosse per il fatto che se elimino l'ultima riga mi dà l'errore di ArayIndexOutOfBoundsException. Vi posto il mio codice, magari potete darmi una mano.

    CLASS MYTABLEMODEL:

    codice:
    class MyTableModel extends AbstractTableModel{
     private String[] columnNames = {"NOME","CATEGORIA","DATA SCANDENZA","",""};
     private Vector data = new Vector();
    
     public int getColumnCount(){
      return columnNames.length;
     }
     
     public void insertData(Object[] values){
      data.add(new Vector());
      for (int i=0; i<values.length; i++){
       ((Vector) data.get(data.size()-1)).add(values[i]);
      }
      fireTableDataChanged();
     }
     
     public String getColumnName(int col){
      return columnNames[col];
     }
     
     public int getRowCount(){
      return data.size();
     }
     
     public Object getValueAt(int row, int col){
      return ((Vector) data.get(row)).get(col);
     }
     public boolean isCellEditable(int row, int col) {
      if (col<4){
       return false;
      }else{
       return true;
      }
     }
     
     public void removeRow(int row){
      data.remove(row);
      fireTableRowsDeleted(row,row);
     }
     
     public void setValueAt(Object value, int row, int col){
      ((Vector) data.get(row)).setElementAt(value, col);
      fireTableCellUpdated(row,col);
     }
    }

    CLASS BUTTON RENDERER:

    codice:
    class ButtonRenderer extends JButton implements TableCellRenderer
    {
     public ButtonRenderer(){
      //BUTTON PROPERTIES
      setOpaque(true);
     }
     public Component getTableCellRendererComponent(JTable table, Object obj,
       boolean selected, boolean focused, int row, int col) {
      
      if(selected){
       setForeground(table.getSelectionForeground());
       setBackground(table.getSelectionBackground());
      }else{
       setForeground(table.getForeground());
       setBackground(UIManager.getColor("Button.background"));
      }
       
      setText((obj==null) ? "":obj.toString());
      return this;
     }
    }

    CLASS BUTTON EDITOR:

    codice:
    class ButtonEditor extends DefaultCellEditor{
     
     protected JButton btn;
     private String lbl;
     private Boolean clicked;
     private DeleteButtonListener bListener = new DeleteButtonListener();
     
     public ButtonEditor(JCheckBox cbox) {
      
      super(cbox);
      btn = new JButton();
      btn.setOpaque(true);
      
      //WHEN BUTTON IS CLICKED
      btn.addActionListener(bListener);
     }
     
     public Component getTableCellEditorComponent(JTable table, Object obj, boolean selected, int row, int col){
      
      bListener.setRow(row);
      bListener.setTable(table);
      lbl = (obj == null) ? "":obj.toString();
      btn.setText(lbl);
      return btn;
     }
     
    }

    CLASS ACTIONLISTENER OF JBUTTON:

    codice:
    class DeleteButtonListener implements ActionListener{
     private int row;
     private JTable table;
     
     public void setRow(int row){
      this.row = row;
     }
     
     public void setTable(JTable table){
      this.table = table;
     }
     
     public void actionPerformed(ActionEvent event){
      if(table.getRowCount() > 0){
       ((MyTableModel)table.getModel()).removeRow(this.row);
      }
     }
    }
    Ultima modifica di LeleFT; 17-07-2015 a 09:39 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da miketambu Visualizza il messaggio
    Salve ragazzi. Avrei bisogno di un vostro aiuto. Ho implementato una JTable nella quale ho un JButton per ogni riga inserita. All'evento del pulsante voglio eliminare la riga stessa. Ho implementato l'apposito evento e in parte funziona, se non fosse per il fatto che se elimino l'ultima riga mi dà l'errore di ArayIndexOutOfBoundsException.
    Innanzitutto, visto che il tuo table model ha una struttura dati molto de-strutturata (Vector di Vector di Object) e quindi per niente modellata su una certa entità ... quale è il suo senso/utilità? A quel punto non bastava DefaultTableModel? (magari solo esteso per ridefinire isCellEditable)

    Comunque, il removeRow del table model è corretto (tra l'altro è sostanzialmente la stessa cosa che fa il removeRow di DefaultTableModel). Quindi il problema è sicuramente altrove ma in questo momento non avrei tempo di indagare sul tuo codice.
    Tra l'altro, il giro/connessione tra ButtonEditor e DeleteButtonListener non lo trovo particolarmente piacevole/buono.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto, visto che il tuo table model ha una struttura dati molto de-strutturata (Vector di Vector di Object) e quindi per niente modellata su una certa entità ... quale è il suo senso/utilità? A quel punto non bastava DefaultTableModel? (magari solo esteso per ridefinire isCellEditable)

    Comunque, il removeRow del table model è corretto (tra l'altro è sostanzialmente la stessa cosa che fa il removeRow di DefaultTableModel). Quindi il problema è sicuramente altrove ma in questo momento non avrei tempo di indagare sul tuo codice.
    Tra l'altro, il giro/connessione tra ButtonEditor e DeleteButtonListener non lo trovo particolarmente piacevole/buono.
    Potrebbe quindi essere la struttura dati il problema? Mi consigli di un dare un object[][]?

Tag per questa discussione

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.