1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| public class JTablePopup {
public static void main(String[] args) {
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable table = createTable();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setRowHeaderView(table.getTableHeader());
frame.add(table.getTableHeader(), BorderLayout.NORTH);
frame.add(scrollPane);
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static JTable createTable() {
DefaultTableModel model = new DefaultTableModel(fill(new Object[20][4]),new String[]{"col1","col2","col3","col4"});
JTable table = new JTable(model);
table.setFillsViewportHeight(true);
// affectation d'un menu popup à la table
table.setComponentPopupMenu(createPopUpMenu(table, model));
return table;
}
private static Object[][] fill(Object[][] data) {
Random random = new Random();
for(int n=0; n<data.length ; n++) {
Object[] line = data[n];
for(int i=0; i<line.length; i++) {
line[i]=i==0?"Line "+(n+1):random.nextInt(100);
}
}
return data;
}
private static JPopupMenu createPopUpMenu(JTable table, DefaultTableModel model) {
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem menuModify = createMenuItem("Modifier",e-> modifySelection(table, model));
popupMenu.add(menuModify);
JMenuItem menuRemove = createMenuItem("Supprimer",e-> removeSelection(table, model));
popupMenu.add(menuRemove);
menuModify.setEnabled(false);
menuRemove.setEnabled(false);
// gère l'activation des menus en fonction de la selection
table.getSelectionModel().addListSelectionListener(e-> {
if ( !e.getValueIsAdjusting() ) {
switch ( table.getSelectedRowCount() ) {
case 0: // sélection vide : aucun menu disponible
menuModify.setEnabled(false);
menuRemove.setEnabled(false);
break;
case 1: // sélection unique : on peut modifier ou supprimer
menuModify.setEnabled(true);
menuRemove.setEnabled(true);
break;
default: // sinon, sélection multiple : on peut supprimer, mais pas modifier (on peut modifier en multiple si le formulaire est adapté : on peut ici modifier le libéllé du menu pour qu'il affiche "Modification" ou "Modication multiple", ou autre en fonction de différents critères...)
menuModify.setEnabled(false);
menuRemove.setEnabled(true);
break;
}
}
}
);
popupMenu.add(menuModify);
popupMenu.add(menuRemove);
// gère la sélection automatique (sans perte de la sélection faite normalement, en particulier la multiple sélection)
popupMenu.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
int row = table.rowAtPoint(table.getMousePosition());
if ( row >= 0 && row < table.getRowCount() && !table.isRowSelected(row) ) {
table.setRowSelectionInterval(row, row);
}
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
return popupMenu;
}
private static void modifySelection(JTable table, DefaultTableModel model) {
int selectedRow = table.getSelectedRow();
JOptionPane.showConfirmDialog(table, "Modifier ligne " + (selectedRow+1));
}
private static void removeSelection(JTable table, DefaultTableModel model) {
int rowShift=0;
for(int selectedRow : table.getSelectedRows() ) {
model.removeRow(selectedRow-rowShift);
rowShift++; // à chaque fois qu'on supprime une ligne, on décale l'index des lignes suivantes d'autant que de lignes supprimées
}
}
private static JMenuItem createMenuItem(String label, ActionListener actionListener) {
JMenuItem menu = new JMenuItem(label);
menu.addActionListener(actionListener);
return menu;
}
} |
Partager