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

AWT/Swing Java Discussion :

Mettre des components dans les cases d'une JTreeTable


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut Mettre des components dans les cases d'une JTreeTable
    Bonjour,

    J'ai une grosse interface à réaliser en utilisant des JTreeTable et je n'ai aucune expérience dans leur utilisation. Peut-être que vous aller pouvoir m'aider :

    Je dispose donc d'une JTreeTable dans laquelle se trouvent, à gauche un arbre et à droite des champs. Ce que que je souhaite faire, c'est éditer les champs de la colonne de droite et pour celà, si les champs sont des string, mettre un JTextField dans la case, si ce sont des entiers, mettre un JSpinner, et des checkBox pour les booléens.

    Pouvez vous m'indiquer une piste pour faire celà, donc c'est à dire pour changer les composants des cases en fonction de leur contenu.

    Merci beaucoup.

  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
    Utilises des Renderers pour tes cases.

    Ensuite il faut savoir s'où vient le treetable que tu utilises (SwingX, sun...)?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    De quelle classe est étendue ce Renderer et par quelle commande est-ce que je vais dire que c'est celui qui dessinera les cases de la table ?

    En fait, j'ai un code déjà existant que m'a filé mon boss mais il faut que je l'améliore et que je débugge aussi. Mais j'ai du mal à bien comprendre le principe des JTreeTable. Par exemple, je n'arrive absolument pas à changer le rendu des cellules de ma table. J'arrive à changer les couleurs du tree comme je veux mais pas celles de la table. Ca me frustre, je n'avance pas. Et je ne trouve pas de tutorial sur internet qui explique comment changer le rendu de la table d'un JTreeTable. En fait, c'est vraiment la question fondamentale que je me pose. Comment "set"-er le cell-renderer des cellules de la table dans un JTreeTable ?

    Et si ça répond à ta question, ma TreeTable étend JTreeTable et mon model étend TreeTableModel.

    Merci. Chaque réponse m'aidera bcp je pense

  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
    Tout dépend d'où vient ta JTreeTable.
    Possède-t'elle une méthode setDefaultCellRenderer dans son code ou par héritage?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    Non, elle n'a que :
    - un constructeur qui fait entre autre un "tree.setCellRenderer(new TreeTableCellRenderer());", C'est à dire qui donne à l'arbre son CellRenderer et j'arrive à modifier ce CellRenderer pour donner à l'arbre l'aspect que je veux.
    - un changeSelection
    - un getScrollableTracksViewportHeight
    - et un editCellAt

    Je crois qu'il n'est nul part précisé le CellRenderer de la colonne de données qui est à droite de l'arbre et c'est celui là que je souhaite modifier.

  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
    Fais voire le code si tu peux...

    Ta classe hérite de JTree?
    Dans ce cas il va probablement falloir hacker la classe TreeTableCellRenderer.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    Voici le code de ma classe. Il est assez court.

    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
    public class IFMTreeTable extends JTreeTable {
     
     
        private static final long serialVersionUID = 1L;
     
        public IFMTreeTable(TreeTableModel treeTableModel) {
            super(treeTableModel);
            setShowGrid(true);
            setGridColor(new Color(234, 234, 234));
            setIntercellSpacing(new Dimension(1, 1));
            //setIntercellSpacing(new Dimension(0, 0));
     
            JTree tree = (JTree) getDefaultRenderer(TreeTableModel.class);
            //tree.setRootVisible(true);
            tree.setAutoscrolls(false);
            tree.setDoubleBuffered(true);
            tree.setCellRenderer(new IFMTreeTableCellRenderer());
            tree.setLargeModel(true);
            tree.setName("IFMTree");
            tree.setScrollsOnExpand(true);
     
            new TableColumnResizer(this);
        }
     
        public boolean editCellAt(int row, int column, EventObject e) {
            if (e instanceof MouseEvent) {
                MouseEvent me = (MouseEvent) e;
                // If the modifiers are not 0 (or the left mouse button),
                // tree may try and toggle the selection, and table
                // will then try and toggle, resulting in the
                // selection remaining the same. To avoid this, we
                // only dispatch when the modifiers are 0 (or the left mouse
                // button).
                if (me.getModifiers() == 0 || me.getModifiers() == InputEvent.BUTTON1_MASK) {
                    for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
                        if (getColumnClass(counter) == TreeTableModel.class) {
                            MouseEvent newME = new MouseEvent(tree, me.getID(), me.getWhen(), me.getModifiers(),
                                    me.getX() - getCellRect(0, counter, true).x, me.getY(), me.getClickCount(), me.isPopupTrigger());
                            tree.dispatchEvent(newME);
                            break;
                        }
                    }
                }
                return false;
            }
            return super.editCellAt(row, column, e);
        }
     
        // mouse press intended for resize shouldn't change row/col/cell celection
        public void changeSelection(int row, int column, boolean toggle, boolean extend) {
            if (getCursor() == TableColumnResizer.resizeCursor) {
                return;
            }
            super.changeSelection(row, column, toggle, extend);
        }
     
        // overriden to make the height of scroll match viewpost height if smaller
        public boolean getScrollableTracksViewportHeight() {
            return getPreferredSize().height < getParent().getHeight();
        }
    }

    et voici le code de ma classe de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        IFMTreeTableModel model = new IFMTreeTableModel(msg);
        treeTable = new IFMTreeTable(model);
        scroll = new JScrollPane(treeTable) {};
    Pour comprendre, IFMTreeTableModel hérite de TreeTableModel et crée un TreeTableModel à partir d'un fichier txt ici appelé msg.
    Puis on crée un JTreeTable qui prend le TreeTableModel.
    Puis on met ce JTree Table dans un JScollPane mais ça tu l'as déjà compris.

  8. #8
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Salut,

    Si ton JTreeTable étends JTable,
    alors tu peux faire comme moi !

    utiliser cette méthode dans le constructeur du JTreeTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    setDefaultRenderer(String.class, new JTextField()); //pour une chaine
    setDefaultRenderer(Integer.class, new JSpinner()); //pour un integer
    //etc ......
    A++

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    OOOOuuuuuppppssss ...

    Pardon, je voulais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    setDefaultEditor(String.class, new JTextField()); //pour une chaine
    //Au lieu de setDefaultRenderer(..)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    la javadoc dit : setDefaultEditor(Class columnClass, TableCellEditor editor)

    donc ça ne compile pas avec new JTextField() en deuxième paramètre.
    As-tu vaiment fait comme ça ou est-ce que je dois créer un TableCellEditor ?

    Merci pour les réponses, je sens que la solution n'est plus très loin.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    Alors, j'ai fait ce que j'ai dit lors de mon dernier post, c'est à dire créer un TableCellEditor. Mais maintenant, j'ai un autre problème : Une fois la saisie terminée, je ne peux plus l'arréter. Peu importa que j'appuie sur entrée ou que je clique hors du TextField, l'édition ne s'arrète pas et donc je ne peux pas éditer d'autres cellules.
    Quelqu'un sait comme résoudre ce problème ?

Discussions similaires

  1. soucis pour mettre des couleurs dans les composants
    Par lostsoul dans le forum NetBeans
    Réponses: 4
    Dernier message: 06/08/2010, 12h15
  2. [XL-2003] Gestion des decimales dans les operations d'une macro
    Par Potzo dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/06/2010, 13h01
  3. Excel - Mettre des valeurs dans les cellules
    Par shuya dans le forum Débuter
    Réponses: 1
    Dernier message: 10/02/2009, 09h45
  4. mettre des session_start() dans les pages includées ?
    Par 123quatre dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2007, 11h30
  5. Mettre des commentaires dans les requêtes ?
    Par guidav dans le forum Access
    Réponses: 4
    Dernier message: 18/06/2007, 12h16

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