tutorial - table panel java




lignes non supprimées de JTable (2)

Dans ma JTable, toutes mes cases à cocher sont dans la colonne 3. Après avoir cliqué sur un bouton, les lignes cochées seront supprimées.

Mais cependant après avoir implémenté les fonctions dans mon onclick. Cela ne supprime pas les lignes.

La méthode pour l'écouteur de bouton

class DeleteBtnListener implements ActionListener {  
    @Override
    public void actionPerformed(ActionEvent arg0) {
        for(int row = 0; row < table.getRowCount(); ++row) {
            if((Boolean) table.getValueAt(row, 3) == true) {
                myTableModel.removeRow(row);
                table.revalidate();
                table.repaint(); 
            }
        }       
    }
}

et c'est ce qui est dans ma classe AbstractTableModel

@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel {
    private final boolean DEBUG = true;

    private String[] columnNames = {"Name",
            "Age",
            "Salary",
    "Delete"};

    private Object[][] data = {
            {"Kathy", "20",new Integer(5), new Boolean(false)},
            {"John", "35", new Integer(3), new Boolean(false)},
            {"Sue", "20", new Integer(2), new Boolean(false)},
            {"Jane", "12", new Integer(20), new Boolean(false)},
            {"Mary", "42", new Integer(10), new Boolean(false)}
    };

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @SuppressWarnings("unchecked")
    public Class<?> getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {
        return true;
    }

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

        }
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

    public void removeRow(int row) {
        fireTableRowsDeleted(row, row);
    }
}

Pouvez-vous essayer avec DefaultTableModel qui fonctionne parfaitement. Remplacer les autres méthodes de JTable si nécessaire.

exemple de code:

DefaultTableModel model = new DefaultTableModel(data, columnNames);
final JTable table = new JTable(model) {
    @Override
    public Class<?> getColumnClass(int column) {
        switch (column) {
            case 2:
                return Integer.class;
            case 3:
                return Boolean.class;
            default:
                return String.class;
        }
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }
};

Pour supprimer l'appel de ligne

((DefaultTableModel) table.getModel()).removeRow(row);

Vous devez supprimer la ligne des données réelles dans votre modèle (c'est-à-dire les données du tableau). fireTableRowsDeleted n'est pas suffisant. Cela met juste à jour les choses ui. Gardez à l'esprit cependant, vous utilisez un tableau. Vous devrez donc avancer les indices de ligne en conséquence avec les données. Mieux utiliser une liste pour une manipulation plus facile. Gardez également à l'esprit que vous essayez de supprimer des lignes "simultanément" dans la boucle. Donc, si vous supprimez une ligne, vous devez également réduire la ligne dans la boucle.

Aussi comme @AndrewThompson mentionné, il suffit d'utiliser un DefaultTableModel . Je ne vois rien de spécial au sujet de votre modèle qui justifie le besoin d'un modèle personnalisé.

Voici un exemple avec DefaultTableModel

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable {


    private DefaultTableModel myTableModel = getModel();
    private JTable table = new JTable(myTableModel);

    public TestTable() {
        JButton button = new JButton("Remove All");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                for(int row = 0; row < table.getRowCount(); ++row) {
                    if((Boolean) table.getValueAt(row, 3) == true) {
                        System.out.println("true");
                        myTableModel.removeRow(row);
                        row--;
                    }
                } 
            }
        });

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.add(button, BorderLayout.PAGE_END);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private DefaultTableModel getModel() {
        String[] columnNames = {"Name",
                "Age",
                "Salary",
        "Delete"};

        Object[][] data = {
                {"Kathy", "20",new Integer(5), new Boolean(false)},
                {"John", "35", new Integer(3), new Boolean(false)},
                {"Sue", "20", new Integer(2), new Boolean(false)},
                {"Jane", "12", new Integer(20), new Boolean(false)},
                {"Mary", "42", new Integer(10), new Boolean(false)}
        };
        return new DefaultTableModel(data, columnNames) {
            @Override
            public Class<?> getColumnClass(int col) {
                switch(col) {
                case 0: 
                case 1: return String.class;
                case 2: return Integer.class;
                case 3: return Boolean.class;
                default: return Object.class;
                }
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new TestTable();
            }
        });
    }
}




tablemodel