Comment rendre un JTable non modifiable


Réponses:


22

Vous pouvez utiliser un TableModel .

Définissez une classe comme celle-ci:

public class MyModel extends AbstractTableModel{
    //not necessary
}

isCellEditable()est en fait falsepar 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());

1
Vous ne pouvez pas demander à une public voidméthode de renvoyer un booléen.
Geo

1
Aussi la méthode estisCellEditable
Matt

Bien que l'approche que vous spécifiez fonctionne, il n'existe pas de méthode telle que isEditable dans le AbstractTableModel. Ce qui existe est la méthode isCellEditable (int, int) qui prend rowIndex et coulmnIndex comme paramètres. L'utilisateur peut activer / désactiver de manière sélective l'édition pour une ligne / colonne particulière en remplaçant la méthode "isCellEditable" ou peut utiliser l'implémentation par défaut pour désactiver l'édition pour toutes les cellules.
samedi

150

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 JTabledisparaî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);

3
C'est également la solution pour que les événements de double-clic fonctionnent correctement avec JTable. Un double-clic est normalement consommé par une cellule lorsqu'elle passe en mode d'édition, ce qui empêchera une cellule de le faire et enverra à la place le double-clic au JTable lui-même. Merci pour la solution, Nelson!
anchorite

2
@Jop alors quelque chose ne va pas ailleurs dans votre code - une table ne disparaît jamais simplement parce que le modèle de la table n'est pas modifiable ...
kleopatra

1
@DougHauf il semble que vous ne connaissez pas Java, ni vraiment aucun langage puisque la plupart des langages utilisent la même syntaxe pour les opérations booléennes ... cela renvoie un booléen ... Je vous recommanderais d'aller trouver un Java très basique tutoriel et recommencez depuis le début. Essayer de se lancer comme ça va finir par apprendre tout de travers.
searchengine27

1
@DougHauf, le == est un alias de la fonction Equals qui compare les objets (à gauche et à droite) et renvoie un booléen. Je suppose que vous avez utilisé l'instruction si cela évalue les booléens et est généralement utilisé avec ce type d'expressions, par exemple si (a == b) faites quelque chose. Essayez d'imprimer a == b ou affectez simplement ceci à une variable et comprenez le résultat.
nelson eldoro

1
Le correctif ci-dessus ne fonctionne pas non plus pour moi. Cela fait disparaître la colonne et les éléments de données de la table. Ma table est créée avec table = new JTable (tempTable, columnNames) ;, où tempTable est une chaîne [] [] et Column Names est une chaîne []. Je pense que le problème est causé par le nouveau DefaultTableModel () ne spécifiant pas les données et les noms de colonne pour le modèle de table. Comment les spécifier dans le modèle de données. J'ai essayé table.setModel (tableModel (tempTable, columnNames));, mais cela provoque une erreur "Impossible de trouver le symbole".
user1164199

49
table.setDefaultEditor(Object.class, null);

2
C'est la réponse la meilleure et la plus simple. Bien sûr, vous devez définir l'éditeur sur null pour ne pas pouvoir le modifier.
LEMUEL ADANE

Cela fonctionne très bien avec une seule sélection. C'était ma demande.
Wesos de Queso

Cela devrait être la RÉPONSE!
KrishPrabakar

36

il suffit d'ajouter

table.setEnabled(false);

Ça fonctionne bien pour moi.


1
C'est génial si vous n'utilisez pas de modèle de table personnalisé!
Kingsolmn

26
Mais vous ne pourrez pas sélectionner une cellule ou une ligne.
tianz

3
Cela semblera "grisé" dans certains L&F.
stommestack

2
Ça marche. Merci. Cependant, j'aimerais toujours savoir pourquoi la méthode du modèle de données de Nelson fait disparaître la colonne et les éléments de données du tableau.
user1164199

1
Fonctionne bien pour moi!
Colby Cox

10

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.


4
-1 piratage aléatoire à des endroits inappropriés n'est jamais une option
kleopatra

S'il vous plaît, pouvez-vous expliquer pourquoi il s'agit d'un "piratage aléatoire à des endroits inappropriés"? Selon le document setDefaultEditor () : "Si l'éditeur est nul, supprime l'éditeur par défaut pour cette classe de colonne."
freesoft

oui, et revient à la valeur par défaut pour Object ;-) Donc, vous ne désactivez pas vraiment l'édition (juste accidentellement si l'une des colonnes est de type Object), il vous manque également des colonnes qui pourraient avoir un éditeur personnalisé. Il existe une API destinée à être implémentée pour contrôler la modiabilité des cellules, et c'est celle du modèle. Tout le reste est piraté et en tant que tel inapproprié.
kleopatra

Je vois ce que tu veux dire. Mais ce que j'ai compris de l'API, c'est que si je crée une table de manière rapide (avec "new JTable (Vector, Vector)"), alors la table aura des éditeurs par défaut pour toutes ses colonnes. Donc, si je lance "table.setDefaultEditor (column, null)", alors je supprimerai l'éditeur par défaut de la colonne, donc la colonne n'aura pas d'éditeur et la colonne ne sera pas modifiable. Qu'il sera?
freesoft

J'avais créé la table de cette façon new JTable(Vector, Vector)et travaillé pour moi. Je n'ai besoin d'aucun éditeur dans aucune cellule, vous avez donc mon vote.
Dani Sancas

3

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);

2
La sélection ne sera pas possible.
h3xStream

Solution simple et agréable
Nuwan Harshakumara Piyarathna

La question est modifiable non activée. Activer ne résout pas le but
shaILU

2

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()));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.