IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Rendre une colonne de JTable non éditable dynamiquement


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut Rendre une colonne de JTable non éditable dynamiquement
    Bonsoir à tous,
    j'ai des soucis avec ma JTable décidément lol.
    Voila à la base ce que ça donne :


    Pour l'instant j'ai réussi à faire en sorte que quand j'édite une des cellules de texte, les colonnes avec les boutons Valider et Annuler deviennent enabled (true). Et quand on appuie sur l'un d'eux ils redeviennent (false).

    J'aimerai accompagner ces actions par le fait que la cellule en elle-même devienne non éditable (mais pas toute la colonne sinon ça n'aurait aucun sens). Est-ce possible cellule par cellule? Serait-il possible d'inhiber l'Editor sur une cellule par exemple afin qu'elle ne soit plus du tout sélectionnable?
    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    C'est la fonction isCellEditable qui détermine si une cellule est éditable ou non.
    A toi de stocker les coordonnées des lignes et/ou colonnes et/ou cellules qui ne doivent pas être éditables.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    isCellEditable est appelée une fois au début de la construction de la table, et reste par la suite statique, pour ça que je parlais de "dynamiquement". Il ressemble à ça au départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean isCellEditable(int row, int col) {
        return col==2 ? false : true;
    }
    Pour l'instant, en début de setValueAt du Tablemodel (donc à chaque fois qu'on sort de l'édition d'une cellule) je rends les boutons Valider et Annuler de la ligne correspondante inactfis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void setValueAt (Object aValue, int rowIndex, int columnIndex) {
    		if (aValue != null) {
    			Piece piece = lignes.get (rowIndex);
     
                            ValiderBtnCell validerBtnCell = new ValiderBtnCell();
    			validerBtnCell.validerBtn.setEnabled(false);
    			validerBtnCell.setEnabled(false);
    			piece.setValiderBtnCell(validerBtnCell);
     
    			AnnulerBtnCell annulerBtnCell = new AnnulerBtnCell();
    			annulerBtnCell.annulerBtn.setEnabled(false);
    			piece.setAnnulerBtnCell(annulerBtnCell);
     
    			Ppal.TableR.repaint();
    "lignes" est une List de "Piece".
    chaque "Piece" est un objet (une classe) contenant les données d'une ligne (et notamment les boutons "Valider" et "Annuler" en colonnes 9 et 10).

    Pour bien faire il faudrait à ce moment là transformer mon isCellEditable en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public boolean isCellEditable(int row, int col) {
        if (col==2 || col==9 || col==10){
            return false;
        } else {
            return true;
        }
    }
    Mais je ne vois pas comment ça serait possible de modifier une fonction en plein programme lancé.... :S



    Edit : pour info, les classes ValiderBtnCell et AnnulerBtnCell sont en fait des JPanel (contenant mes boutons). Peut être peut-on agir directement sur le composant en lui-même. Y a-t-il une méthode de JPanel lui interdisant de prendre le focus ou un truc du genre qui empêcherait de pouvoir cliquer sur la cellule ?

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah, à toi de prévoir une méthode setColEditable(boolean editable, int columnIndex) dans ton modèle, et de stocker une liste de colonnes éditables, ou alors d'avoir un statut Editable/Non éditable par colonne.

    Et d'appeler cette méthode au moment opportun.

    (et bien sur que la méthode isCellEditable s'appuie sur ces informations pour déterminer sa valeur de retour).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Ah oki ça y est je viens de comprendre, décidément j'ai du mal à appréhender le système MVC lol

    Je pensais que isCellEditable était appelé une fois pour toutes lors de la construction de la table, et qu'il définissait donc les cellules, ou colonnes, editable ou non. En fait je viens de voir qu'elle est appelé à chaque évènement de la souris pour un clic dans une cellule, et évalue donc à ce moment là si elle est éditable ou non. Effectivement en partant de ce principe tout est permis et la dynamique est de mise.

    Dans mon cas, sachant qu'en fait je peux déjà utiliser le isEnabled() des boutons comme booléens afin de savoir si elle sera éditable, ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public boolean isCellEditable(int row, int col) {
        if (col==2 ||
            (getValueAt (row, col).getClass().getSimpleName().equals ("ValiderBtnCell") && !((ValiderBtnCell) getValueAt (row, col)).getValiderBtn().isEnabled()) ||
            (getValueAt (row, col).getClass().getSimpleName().equals ("AnnulerBtnCell") && !((AnnulerBtnCell) getValueAt (row, col)).getAnnulerBtn().isEnabled())) {
    	return false;
        } else {
            return true;
        }
    }
    Franchement, les JTable, galère à comprendre, mais une fois qu'on capte le concept les possibilités sont énormes!
    Merci encore tu m'as aidé sur plusieurs topics en +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rendre une colonne d'une DBGrid éditable
    Par einstein7955 dans le forum Delphi
    Réponses: 14
    Dernier message: 21/06/2017, 10h53
  2. Rendre une colonne d'un arbre éditable
    Par Narizuke dans le forum SWT/JFace
    Réponses: 9
    Dernier message: 11/06/2015, 12h14
  3. [Swing / JTable] Rendre les cellules d'un JTable non éditables
    Par Jérôme_20 dans le forum Composants
    Réponses: 20
    Dernier message: 10/02/2011, 10h32
  4. [JTable] Rendre une colonne non éditable
    Par d_hazem dans le forum Composants
    Réponses: 2
    Dernier message: 04/06/2008, 10h48
  5. JTables non éditables et colonnes non déplacables
    Par Belegkarnil dans le forum Composants
    Réponses: 3
    Dernier message: 29/08/2006, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo