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 :

Selection de ligne impossible avec un editeur personnalisé


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Selection de ligne impossible avec un editeur personnalisé
    Bonjour,


    Voici mon problème, j'ai créé une JTable avec un modèle, un renderer, et un éditeur personnalisé. Dans une JTable classique, pour éditer un champs String, il faut double cliquer sur celui-ci. Un simple clic aura pour effet de désélectionner les autres champs en cours d'édition, et de mettre la ligne en surbrillance (la sélectionner).

    Mon code fonctionne bien, sauf que lorsque je clique sur un champs String, je passe directement en mode édition, sans passer par la sélection. C'est très problématique dans mon cas. Auriez-vous une idée de la cause du problème? Le code est-il nécessaire à la bonne compréhension de la situation? J'ai quand même un doute, je pense pas que l'éditeur soit vraiment en cause vu que le code reste très simple...

    Voici mon Editeur :

    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
    23
    24
    25
     
    public class PduCellEditor extends AbstractCellEditor implements TableCellEditor {
     
        //This is the component that will handle the editing of the cell value
        private JComponent component = new JTextField();
     
        //This method is called when a cell value is edited by the user.
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int rowIndex, int vColIndex) {
            // 'value' is value contained in the cell located at (rowIndex, vColIndex)
            if (isSelected) {
                // cell (and perhaps other cells) are selected
            }
            // Configure the component with the specified value
            ((JTextField)component).setText((String)value);
            // Return the configured component
            return component;
        }
     
        // This method is called when editing is completed.
        // It must return the new value to be stored in the cell.
        public Object getCellEditorValue() {
            return ((JTextField)component).getText();
        }
    }

    Merci d'avance à tout ceux qui se pencheront sur mon problème, je pense que c'est relativement simple mais je n'ai rien trouvé dans la base...


    J'ai pensé à une solution, dans le cas ou l'utilisateur clique pour la première fois sur cette case, je retourne simplement un JLabel avec une couleur de fond bleue, si c'est la 2ème fois, je retourne le textfield, mais ca me parrait bien crade comme solution... Y'a pas moyen de faire gérer ca nativement par la JTable? Genre sur un simple clic, elle se contente de sélectionner, sur un double clic, elle appelle l'éditeur... Faut-il que je fasse un gestionnaire de sélection?


    Edit : Merci adiGuba, la précipitation tout ca...

  2. #2
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Essaie ceci:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
     
    public class PduCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
     
        //This is the component that will handle the editing of the cell value
        private JTextField component = new JTextField();
        private int clickCountToStart = 2;
     
        public PduCellEditor() {
            component.addActionListener(this);
        }
     
        //This method is called when a cell value is edited by the user.
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            // 'value' is value contained in the cell located at (rowIndex, vColIndex)
            if (isSelected) {
                // cell (and perhaps other cells) are selected
            }
            // Configure the component with the specified value
            component.setText((value != null) ? value.toString() : "");
            // Return the configured component
            return component;
        }
     
        // This method is called when editing is completed.
        // It must return the new value to be stored in the cell.
        @Override
        public Object getCellEditorValue() {
            return component.getText();
        }
     
        @Override
        public boolean isCellEditable(EventObject anEvent) {
            if (anEvent instanceof MouseEvent) {
                return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
            }
            return true;
        }
     
        @Override
        public boolean shouldSelectCell(EventObject anEvent) {
            return true;
        }
     
        @Override
        public boolean stopCellEditing() {
            fireEditingStopped();
            return true;
        }
     
        @Override
        public void cancelCellEditing() {
            fireEditingCanceled();
        }
     
        public void actionPerformed(ActionEvent e) {
            stopCellEditing();
        }
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Salut et merci de t'intéresser à mon problème

    Alors, j'ai essayé ta solution, ca fonctionne bien et c'est beaucoup plus propre que ce que j'avais en tête, mais il reste un soucis dont je ne trouve pas la source.

    Quand je clique une seule fois sur la cellule, elle se sélectionne bien et ne rentre pas en mode édition, en revanche elle est vide et blanche, au lieu d'être remplie et bleue.

    Typiquement, j'ai une suite d'octets dans ma cellule, je clique une fois, la cellule est sélectionnée et vide. Je clique ailleurs, les octets réapparaissent (c'est donc juste le Label retourné lors de la sélection qui pêche). Je clique deux fois, je passe en mode édition, la trame apparait bien, pas de soucis.



    Je continue mes recherches, merci pour votre aide!

    Edit : c'est assez troublant, lorsque je clique une fois sur ma cellule, elle se vide, mais si je tape quelque chose au clavier, le contenu réapparait et se met à jour, pourtant je ne suis pas en mode édition... Bon, ca ne concerne pas ce sujet, mais j'ai vraiment du mal à comprendre cette édition "sans éditeur" :p On dirait que la JTable écoute ce qui est tapé au clavier et met à jour le Label en direct, sans même passer par un JTextField... Il a l'air curieux leur composant quand même...

  4. #4
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Il a l'air curieux leur composant quand même...
    Ah ça, cher ami, vous n'êtes pas le seul de cet avis !
    afficher des données ça va, après ça se complique, je trouve.

  5. #5
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Cela fonctionne bien chez moi. Je devine que tu as mis en place un "renderer" qui est mal implémenté.

    Il existe 3 manières différentes d'éditer une cellule contenant du texte dans un JTable:

    * utiliser F2 pour appeler l'éditeur
    * Utiliser un double clic pour appeler l'éditeur
    * Commencer à taper sur la cellule courante.

    Dans les deux premiers cas, l'éditeur fait des prises de "focus" et le curseur est visible. Cela signifie que tu peux positionner le curseur n'importe où dans la cellule et modifier une partie du texte. Donc, tu as le plein contrôle sur ce que tu édite.

    Dans le dernier cas, tu n'as aucun contrôle sur le lieu où le texte est ajouté et le texte que tu tape est simplement ajouté à la fin du texte existant. Cela peut ou ne peut pas être le comportement que tu désire.

    Dans le cas où ce n'est pas le comportement que tu désire, une option que tu as est de désactiver l'édition par défaut en tapant directement dans une cellule. Ceci est fait en utilisant la propriété JTable suivante:

    table.putClientProperty ("JTable.autoStartsEdit", Boolean.FALSE);

    Maintenant, cela va forcer l'utilisateur à placer la cellule en mode édition d'abord, en utilisant soit F2 ou un double clic de souris, avant de changer les données.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Super je ne connaissais pas ces 3 modes d'édition, je préfère en effet désactiver l'édition par défaut vu les traitements que je fais en cours d'édition (des calculs / MAJ de CRC).

    Concernant mon renderer, je me penche dessus.


    Merci beaucoup, je met le sujet en résolu.

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

Discussions similaires

  1. Suppression de lignes impossible avec xlCellTypeBlanks
    Par Trust dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/09/2008, 13h03
  2. Selection multiple impossible avec un listbox
    Par jolzeviking dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/09/2008, 08h37
  3. Selection d'une plage avec ligne variable
    Par ginkas31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/01/2008, 07h04
  4. selection impossible avec jsp
    Par midou84 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/11/2007, 12h03
  5. combobox 2 selections consécutives sur même ligne impossible
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/11/2007, 14h46

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