Agregue Jbutton a cada fila de un Jtable

Necesito tu ayuda, quiero agregar un botón J (botón eliminar) a cada fila de un Jtable. Hasta ahora, agregué el botón a cada fila, pero tengo un problema con la acción. Intenté esto, pero no está funcionando. Cuando hago clic en el botón no pasa nada. ¿Alguien puede ayudarme, por favor? Estoy realmente apurado. Este es mi código:

`public class Fenetre extends JFrame { Statement stmt; Map row_table = new HashMap(); JButton addUser; public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 140); String requeteListeUser=" SELECT * FROM COMPTE_UTILISATEUR"; try{ stmt= (Statement) new Connexion().getConnection().createStatement(); ResultSet resultat= stmt.executeQuery(requeteListeUser); resultat.last(); String title[] = {"Nom","Prenom","Matricule","Action"}; int rowCount = resultat.getRow(); Object[][] data = new Object[rowCount][4]; final JTable tableau = new JTable(data,title); JButton jButton2= new JButton("Supprimer"); // this.tableau = new JTable(model); tableau.getColumn("Action").setCellRenderer(new ButtonRenderer()); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); int i=0; resultat.beforeFirst(); // on repositionne le curseur avant la première ligne while(resultat.next()) //tant qu'on a quelque chose à lire { //Remplire le tableau à deux dimensions Data[][] for(int j=1;j<=4;j++) { if(j != 4)data[i][j-1]=resultat.getObject(j)+""; else { data[i][j-1] = jButton2; jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ((DefaultTableModel)tableau.getModel()).removeRow(tableau.getSelectedRow()); } }); } } i++; row_table.put(i, resultat.getInt("id_utilisateur")); } } catch(SQLException ex){ System.out.println(ex); } addUser = new JButton("Ajouter un utilisateur"); addUser.setPreferredSize(new Dimension(60,30)); addUser.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { new AjouterUtilisateur().setVisible(true); } }); this.getContentPane().add(addUser,BorderLayout.SOUTH); } //Classe modèle personnalisée class ZModel extends AbstractTableModel{ private Object[][] data; private String[] title; //Constructeur public ZModel(Object[][] data, String[] title){ this.data = data; this.title = title; } //Retourne le nombre de colonnes public int getColumnCount() { return this.title.length; } //Retourne le nombre de lignes public int getRowCount() { return this.data.length; } //Retourne la valeur à l'emplacement spécifié public Object getValueAt(int row, int col) { return this.data[row][col]; } } public class ButtonRenderer extends JButton implements TableCellRenderer{ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) { //On écrit dans le bouton ce que contient la cellule setText("Suuprimer"); //On retourne notre bouton return this; } } public static void main(String[] args){ //Fenetre fen = new Fenetre(); new Menu().setVisible(true); } }` 

Agregar un botón a la columna de JTable para realizar una acción es … personalmente … restrictivo y un poco, bueno, la web de los 80 …

Considere un enfoque diferente del problema, en lugar de colocar botones en las columnas, que ocupan espacio real en la pantalla, lo que, si se configura correctamente, podría aparecer fuera de la pantalla y limitar al usuario a una sola acción repetitiva cuando se trata de varias filas (es decir , quieren eliminar varias filas de una vez), puede usar una JToolBar y / o JMenu para proporcionar acceso a la función de eliminación, lo que le permitiría al usuario seleccionar una o más filas y eliminarlas con un solo clic …

Considere también, usted proporciona una acción que puede ser activada por la tecla Eliminar en el teclado para realizar la misma acción, liberando al usuario de tener que levantar sus manos del teclado …

Incluso podría adjuntar un JPopupMenu a la mesa …

Este es, en realidad, un caso de uso muy común, y si está diseñado correctamente, muy reutilizable …

Por ejemplo…

Tabla mutable

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; import java.util.Vector; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; public class EditRows { public static void main(String[] args) { new EditRows(); } public EditRows() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } DefaultTableModel model = new DefaultTableModel(); for (int index = 0; index < 13; index++) { model.addColumn(Character.toString((char) (index + 65))); } for (int row = 0; row < 100; row++) { Vector rowData = new Vector<>(13); for (int col = 0; col < 13; col++) { rowData.add(row + "x" + col); } model.addRow(rowData); } JTable table = new JTable(model); DeleteRowFromTableAction deleteAction = new DeleteRowFromTableAction(table, model); JToolBar tb = new JToolBar(); tb.add(deleteAction); InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap am = table.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "deleteRow"); am.put("deleteRow", deleteAction); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(tb, BorderLayout.NORTH); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public abstract class AbstractTableAction extends AbstractAction { private T table; private M model; public AbstractTableAction(T table, M model) { this.table = table; this.model = model; } public T getTable() { return table; } public M getModel() { return model; } } public class DeleteRowFromTableAction extends AbstractTableAction { public DeleteRowFromTableAction(JTable table, DefaultTableModel model) { super(table, model); putValue(NAME, "Delete selected rows"); putValue(SHORT_DESCRIPTION, "Delete selected rows"); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { setEnabled(getTable().getSelectedRowCount() > 0); } }); setEnabled(getTable().getSelectedRowCount() > 0); } @Override public void actionPerformed(ActionEvent e) { System.out.println("..."); JTable table = getTable(); if (table.getSelectedRowCount() > 0) { List selectedRows = new ArrayList<>(25); DefaultTableModel model = getModel(); Vector rowData = model.getDataVector(); for (int row : table.getSelectedRows()) { int modelRow = table.convertRowIndexToModel(row); Vector rowValue = (Vector) rowData.get(modelRow); selectedRows.add(rowValue); } for (Vector rowValue : selectedRows) { int rowIndex = rowData.indexOf(rowValue); model.removeRow(rowIndex); } } } } } 

Echa un vistazo a:

  • Cómo usar acciones
  • Cómo usar enlaces de teclas
  • Cómo usar barras de herramientas
  • Cómo usar los menús

Para más detalles.

Si todavía está decidido a colocar un botón en la columna de la tabla, eche un vistazo a la columna del botón Tabla