Comment rendre un JTable
non éditable? Je ne veux pas que mes utilisateurs puissent modifier les valeurs dans les cellules en double-cliquant dessus.
Vous pouvez utiliser un TableModel
.
Définissez une classe comme ceci:
public class MyModel extends AbstractTableModel{
//not necessary
}
en fait, isCellEditable()
est false
par défaut, vous pouvez donc l'omettre. (voir: http://docs.Oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )
Ensuite, utilisez la méthode setModel()
de votre JTable
.
JTable myTable = new JTable();
myTable.setModel(new MyModel());
Vous pouvez remplacer la méthode isCellEditable et l'implémenter à votre guise, par exemple:
//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table.setModel(tableModel);
ou
//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//Only the third column
return column == 3;
}
};
table.setModel(tableModel);
Notez si votre table JTable disparaît
Si votre JTable
disparaît lorsque vous l'utilisez, c'est probablement parce que vous devez utiliser le constructeur DefaultTableModel(Object[][] data, Object[] columnNames)
.
//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table.setModel(tableModel);
il suffit d'ajouter
table.setEnabled(false);
ça fonctionne bien pour moi.
table.setDefaultEditor(Object.class, null);
Si vous créez automatiquement le TableModel à partir d'un ensemble de valeurs (avec "new JTable (Vector, Vector)"), il est peut-être plus facile de supprimer les éditeurs des colonnes:
JTable table = new JTable(my_rows, my_header);
for (int c = 0; c < table.getColumnCount(); c++)
{
Class<?> col_class = table.getColumnClass(c);
table.setDefaultEditor(col_class, null); // remove editor
}
Sans les éditeurs, les données ne seront pas modifiables.
Je l'ai utilisé et cela a fonctionné: c'est très simple et fonctionne bien.
JTable myTable = new JTable();
myTable.setEnabled(false);
créer une nouvelle classe DefaultCellEditor:
public static class Editor_name extends DefaultCellEditor {
public Editor_name(JCheckBox checkBox) {
super(checkBox);
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
}
}
et utilisez setCellEditor:
JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));