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

 Java Discussion :

JTable, sélections délirantes


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut JTable, sélections délirantes
    Bonjour tous le monde,

    J'ai de nouveau un soucis. Promis j'ai vérifiié ce que je pouvais.

    Mon problème c'est que les sélection dans ma JTable sont complètement délirantes et pire encore, absolument aléatoires.

    Parfois la ligne est correctement sélectionnée, parfois la sélection va "prendre" une ligne ici + une ou deux cellules plus haut, ou plus bas.
    Parfois aucune sélection ne se fait et parfois ce sont des cellules dispersées qui sont sélectionnées.

    Bref, c'est un grand n'importe quoi.

    Ce n'est qu'un problème d'affichage, car systématiquement, la ligne est bien sélectionnée (j'ai un formulaire avec les données de la ligne qui s'affiche correctement à coté).

    Pourtant je veux une sélection tout ce qu'il y a de plus simple, une ligne à la fois.

    Voici comment j'ai paramétré ma JTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public MatosTab(final MatosModel md) {
    		super(md);
    		setDefaultRenderer(Object.class, new TabCellRenderer());
    		getTableHeader().setReorderingAllowed(false);
    		getTableHeader().setResizingAllowed(true);
    		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		setRowSelectionAllowed(true);
    		setColumnSelectionAllowed(false);
    		setCellSelectionEnabled(false);
    		setShowVerticalLines(false);
    		setShowHorizontalLines(false);
    		setSelectionBackground(new Color(240, 216, 168));
    		setAutoResizeMode(AUTO_RESIZE_OFF);
    Merci

  2. #2
    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
    A mon avis le problème vient plus de ton Renderer qui ne marque pas forcément bien la sélection. Est-ce que le retour de la méthode getSelectedRows est correct?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Le résultat est toujours correct.
    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
    setHorizontalAlignment(SwingConstants.LEFT);
    setIcon(null);
    setText("");
    switch(col) {
    	case 0:	setIcon(Define.matosType[((_Matos) getValueAt(row, 0)).getRef()].getIcone()); break;
    	case 1:
    	case 2:
    	case 3:	super.getTableCellRendererComponent(table, val, isSelected, false, row, col); break;
    	case 4:	setHorizontalAlignment(SwingConstants.RIGHT);
    		setText(Define.EuroFormat.format(getValueAt(row, col))); break;
    	case 5:
    	case 6:
    	case 7:	setText(((Long) getValueAt(row, col)) == 0? "":Define.dateFormat.
    			format(((Long) getValueAt(row, col)))); }
    return this;

  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
    Pour essayer de faire propre, il est préférable en général de s'appuyer sur le composant retourné par le super.getTableCellRendererComponent.

    Dans ton cas ça donnerait ça (les cas 1,2,3 n'ayant plus vraiment d'utilité):


    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
    JLabel l = (JLabel)     super.getTableCellRendererComponent(table, val, isSelected, false, row, col);
     
    l.setHorizontalAlignment(SwingConstants.LEFT);
    l.setIcon(null);
    l.setText("");
    switch(col) {
        case 0:    l.setIcon(Define.matosType[((_Matos) getValueAt(row, 0)).getRef()].getIcone()); break;    
        case 4:    l.setHorizontalAlignment(SwingConstants.RIGHT);
            l.setText(Define.EuroFormat.format(getValueAt(row, col))); break;
        case 5:
        case 6:
        case 7:    l.setText(((Long) getValueAt(row, col)) == 0? "":Define.dateFormat.
                l.format(((Long) getValueAt(row, col)))); 
    }
    return l;

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Tu as raison, c'est certainement plus propre.
    Je ferais comme ça dorénavant, merci.

    Mais ça ne règle pas le problème
    C'est toujours n'importe quoi lorsque je clique.

    Je viens de relancer l'exécution une dizaine de fois.

    Au dernier essai:
    1er clic ligne 2, colonne 3, ok
    2ème clic sur la ligne 2, colonne 3 et la:
    la ligne 2 reste sélectionnée sauf la cellule colonne 3 et 4
    et sélection de la colonne 3 et 4 de la ligne 3

    Mais ce n'est pas un comportement constant.
    Le plus souvent, aucune sélection n'apparait alors que mon formulaire se remplit correctement.

  6. #6
    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
    As tu essayé de reformuler ton case en if/else?

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Drôle d'idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(col == 0)
    	laBel.setIcon(Define.matosType[((_Matos) getValueAt(row, 0)).getRef()].getIcone());
    else if(col == 4) {
    	laBel.setHorizontalAlignment(SwingConstants.RIGHT);
    	laBel.setText(Define.EuroFormat.format(getValueAt(row, col))); }
    else if(col > 4 && col < 8)
    	laBel.setText(((Long) getValueAt(row, col)) == 0? "":Define.dateFormat.format(((Long) getValueAt(row, col))));
    Ça ne pourrait pas venir d'ailleurs plutôt?

    Voici 3 exemples d'un 1er et unique clic.

  8. #8
    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
    Pour l'instant je ne vois pas de piste probante, donc j'essaie de trouver un truc ...


    sinon enlève ton appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setCellSelectionEnabled(false);
    Il est en conflit avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setRowSelectionAllowed(true);
    En effet la javadoc annonce la chose suivante:
    This method is equivalent to setting both the rowSelectionAllowed property and columnSelectionAllowed property of the columnModel to the supplied value.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Noté

    J'ai essayé en vidant le constructeur du JTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public MatosTab(final MatosModel md) {
    	super(md); }
    D'autres soucis, normal, mais même comportement.

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Dans ma JTable j'avais redéfinit valueChanged pour mettre à jour mon formulaire.
    Et....j'avais tout simplement zappé l'appel à super.valueChanged(e)

  11. #11
    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
    Pour cela mieux vaudrait passer par un TableModelListener.

    Aucun besoin de redéfinir la JTable.

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Je me suis mal exprimé.
    En fait, je ne veux pas détecter de changement dans la JTable, rien n'est éditable et l'ajout/suppression d'enregistrement est géré par une méthode du modèle.
    Je veux juste être prévenu lorsque l'utilisateur sélectionne une ligne, pour afficher le formulaire ad-hoc.

  13. #13
    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
    Dans ce cas il faut plutôt passer par un Listener sur le SelectionModel de la JTable (il faut jouter un ListSelectionListener sur le selection model de ta JTable)

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    C'est bien ce que j'ai fais.
    Ma JTable implémente ListSelectionListener et dans son constructeur j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getSelectionModel().addListSelectionListener(this);
    et donc cela me permet de redéfinir valueChanged.

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

Discussions similaires

  1. [JTable] Sélection et CheckboxRenderer
    Par virginie_ dans le forum Composants
    Réponses: 1
    Dernier message: 04/04/2015, 02h32
  2. [JTable] Sélections et déselections
    Par ludo2612 dans le forum Composants
    Réponses: 3
    Dernier message: 12/06/2008, 20h33
  3. [JTable] Sélection d'une Ligne
    Par lanfeustdetroll dans le forum Composants
    Réponses: 4
    Dernier message: 18/08/2005, 18h59
  4. [JTable] Sélection d'une seule cellule
    Par Amara dans le forum Composants
    Réponses: 2
    Dernier message: 01/06/2005, 15h48
  5. [JTable] sélection d'une colonne
    Par I o dans le forum Composants
    Réponses: 2
    Dernier message: 27/04/2005, 16h20

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