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 :

[JTable] Empêcher sélection de certaines cellules


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
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut [Résolu][JTable] Empêcher sélection de certaines cellules
    Salut !

    J'ai une JTable de taille carrée et contenant des objets de manière symétrique suivant la diagonale allant du coin haut gauche vers le coin bas droit.
    Je souhaiterais pouvoir réaliser des sélections dans ma Jtable uniquement sur les cellules situées sous la diagonale.
    J'ai réglé mon problème au niveau intéraction sur la matrice. (mes actions sur les objets associés aux cellules portent bien sur les cellules du dessous de la diagonale) Par contre, visuellement, j'ai encore la possibilité de sélectionner des cellules au dessus de la diagonale.
    Je voudrais donc pouvoir empêcher la sélection des cellules au dessus de ma diagonale en faisant une boucle sur ces cellules et en appelant une méthode du type maCell.enableSelection(false) à l'initialisation de ma JTable. Est qu'il existe une méthode de ce type ?

    Pour l'instant, mon code ressemble un peu à ça au niveau de la sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MaJTable extends JTable {
    	public MaJTable() {
    ...
    		// Sélection de cellules possible de manière monobloc
    		setCellSelectionEnabled(true);
    		setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    ...
    }
    Si vous avez, une autre idée, je suis preneur aussi.
    MERCI !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Par défaut
    Cest super simple. Ta JTable a un TableModel. Ce dernier a une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean isCellEditableAt( int row, int col );
    Tu l'implémentes selon ta convenance et c'est fini !!

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    boolean isCellEditable( int row, int col )
    {
     if( row == 0 )
      return false ;
     
     return true ;
    }
    Ainsi, les cases de la ligne 0 ne sont pas éditables !


    Le tutorial de la JTable sur le site de Sun :
    http://java.sun.com/docs/books/tutor...able.html#data

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut
    Merci Thomas, mais tu as mal lu mon problème. Il s'agit d'empêcher la sélection des cellules et non leur édition.

    Là, je pense faire autrement. J'ai mis la couleur de sélection de manière qu'elle ne s'affiche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		setSelectionForeground(Color.black);
    		setSelectionBackground(new Color(255, 255, 255, 0));
    et j'essaye de mettre à jour moi même le background des cellules que j'ai sélectionnées (j'ai un listener qui se déclenche à chaque fois qu'il y a un changement sur ma sélection et j'arrive à ce niveau à déterminer les coordonnées des cellules sélectionnées). Mais pour l'instant, je n'y arrive pas...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    A tu essayer de faire un CellRenderer ?
    Tu a plus de chance de t'en sortir avec ca amha

  5. #5
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Citation Envoyé par Sun, dans la javadoc de JTable,
    changeSelection

    public void changeSelection(int*rowIndex,
    int*columnIndex,
    boolean*toggle,
    boolean*extend)

    Updates the selection models of the table, depending on the state of the two flags: toggle and extend. All changes to the selection that are the result of keyboard or mouse events received by the UI are channeled through this method so that the behavior may be overridden by a subclass. This implementation uses the following conventions: toggle: false, extend: false. Clear the previous selection and ensure the new cell is selected. toggle: false, extend: true. Extend the previous selection to include the specified cell. toggle: true, extend: false. If the specified cell is selected, deselect it. If it is not selected, select it. toggle: true, extend: true. Leave the selection state as it is, but move the anchor index to the specified location.

    Parameters:
    rowIndex - affects the selection at row
    columnIndex - affects the selection at column
    toggle - see description above
    extend - if true, extend the current selection
    Ce doit donc être possible en surchargeant la methode public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) de JTable avec quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) {
       if(rowIdex==nonslectionnableRow && columnIdex==nonslectionnableColumn) return;
       else super.changeSelection(rowIndex, columnIndex, toggle, extend)
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Par défaut
    Rebonjour. Desolé pour le message de tout à lheure, je devais etre trop fatigué. Je ne sais pas pour le changeSelection, parce je crois que dans ce cas tu vas devoir mettre un selectionlistener et ensuite utiliser cette fonction, parce que je ne crois pas qu'elle soit appelée par la JTable directement.

    Une autre solution, proposée par Alwin est beaucoup plus simple à mettre en place :

    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
    16
    17
    18
    19
    20
    21
    22
    class tonRenderer extends DefaultTableCellRenderer
    {
     
     Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    {
     this.setText( ""+value );
     
     if( cellCanBeSelected( row, column ) && (isSelected ) )
     {
      setBackground( Color.blue );
     }
     else
     {
      setBackground( Color.white );
     }
     
     return this ;
     
     
     
    }
    }
    et tu définis ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     boolean cellCanBeSelected( int row, int column ) { ... }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut
    OK C'est fait et ça marche

    J'ai empêché la sélection dans ma classe TableSelectionListener en gérant moi même les objets sélectionnés contenu dans ma table (j'ai donc un HashSet d'objets sélectionné au niveau de mon modèle).
    Pour l'affichage de la sélection, je le désactive dans l'initialisation de ma JTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    		setCellSelectionEnabled(true);
    		setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    		setSelectionForeground(Color.black);
    		setSelectionBackground(new Color(255, 255, 255, 0));
    ...
    Et ensuite j'ai un renderer pour mes cellules et je redéfinis la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Component getTableCellRendererComponent(
    		JTable table,
    		Object value,
    		boolean isSelected,
    		boolean hasFocus,
    		int rowIndex,
    		int vColIndex) {
    ...
    if (test pour filtrer les cellules sélectionnable && isSelected) {
       setBackground(Color.blue);
    }
    ...
    }
    Et voilà, c'était tout bête !

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 13/03/2015, 10h59
  2. Réponses: 3
    Dernier message: 14/05/2014, 16h54
  3. Réponses: 2
    Dernier message: 31/01/2014, 22h38
  4. [VBA-Excel] - Empêcher sélection de certaines cellules
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/01/2007, 10h04
  5. [JTable] Changer le style de certaines cellulles
    Par bourinator dans le forum Composants
    Réponses: 4
    Dernier message: 08/10/2005, 14h40

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