Comment rendre un JTable
non-modifiable? Je ne souhaite pas que mes utilisateurs puissent modifier les valeurs des cellules en double-cliquant dessus.
Comment rendre un JTable
non-modifiable? Je ne souhaite pas que mes utilisateurs puissent modifier les valeurs des cellules en double-cliquant dessus.
Réponses:
Vous pouvez utiliser un TableModel
.
Définissez une classe comme celle-ci:
public class MyModel extends AbstractTableModel{
//not necessary
}
isCellEditable()
est en fait 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 setModel()
méthode de votre JTable
.
JTable myTable = new JTable();
myTable.setModel(new MyModel());
public void
méthode de renvoyer un booléen.
isCellEditable
Vous pouvez remplacer la méthode isCellEditable et l'implémenter comme vous le souhaitez, 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);
Remarque pour si votre JTable disparaît
Si votre JTable
disparaît lorsque vous l'utilisez, c'est probablement parce que vous devez utiliser le DefaultTableModel(Object[][] data, Object[] columnNames)
constructeur à la place.
//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);
table.setDefaultEditor(Object.class, null);
il suffit d'ajouter
table.setEnabled(false);
Ça fonctionne bien pour moi.
Si vous créez le TableModel automatiquement à 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.
new JTable(Vector, Vector)
et travaillé pour moi. Je n'ai besoin d'aucun éditeur dans aucune cellule, vous avez donc mon vote.
J'ai utilisé ceci et cela a fonctionné: c'est très simple et fonctionne très bien.
JTable myTable = new JTable();
myTable.setEnabled(false);
créez 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()));