web-dev-qa-db-fra.com

Comment rendre une table JTable non éditable

Comment rendre un JTable non éditable? Je ne veux pas que mes utilisateurs puissent modifier les valeurs dans les cellules en double-cliquant dessus.

87
Siddharth Raina

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());
20
JCasso

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);
141
nelson eldoro

il suffit d'ajouter

table.setEnabled(false);

ça fonctionne bien pour moi.

37
Siddhu
table.setDefaultEditor(Object.class, null);
32
Oleg Mikhailov

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.

8
freesoft

Je l'ai utilisé et cela a fonctionné: c'est très simple et fonctionne bien.

JTable myTable = new JTable();
myTable.setEnabled(false);
3
user3518835

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()));
2
Ehsan Jelodar