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

Agents de placement/Fenêtres Java Discussion :

[Swing] Mise à jour JFrame.


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut [Swing] Mise à jour JFrame.
    Bonjour à tous.
    Désolé, encor un post sur les mises à jour de fenêtre et autre JPanel...
    C'est pas le 1er GUI que je fais, mais à chaque fois, c'est un vrai casse-tête.

    Pour résumer : j'ai un JPanel en BorderLayout. En ouest, j'ai une JTree, et au centre, une JTable contenant les informations du noeud sélectionné dans le JTree de gauche.
    Vous aurez compris qu'à chaque click sur un noeud de mon JTree, je charge la JTable correspondante.

    Le problème : pour un noeud donné, la 1ère fois que je click, pas de problème, la JTable se charge correctement. Si je reviens sur mon noeud ultérieurement, la JTable fait ce qu'elle veut : elle se charge ou elle ne se charge pas.

    Remarquez, si je recréé une JTable à chaque click sur un noeud, l'affichage est bon. Mais recréer 10 fois la même JTable, c'est pas terrible...
    Donc j'ai essayé les invalidate(), validate(), upadte(), setOpaque(), etc. Mais rien n'y fait. Je ne dois pas les faire dans le bon ordre, ou je ne connais pas la fonction qu'il me faut.

    En plus, j'aimerais mettre ma JTable dans un JScrollPane, mais là, j'ai encor des résultats différents...

    Bref, si vous avez des conseils...
    D'avance merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut Petite remarque :
    j'ai vu dans la FAQ qu'il ne fallait pas mélanger AWT et Swing, car ça causait notamment des problèmes d'affichages au rafraîchissement.
    Or mes composants sont tous Swing, mais le BorderLayout vient de AWT.
    Mon problème pourraît venir de là ?
    Si oui, quel alternative au BorderLayout ?

  3. #3
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Utilises-tu un TableModel pour ta JTable ?
    Je crois qu'un bout de code sera le bienvenu...


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut Les codes :
    Voici les codes :
    Code Initialisation de ma fenêtre : 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
            TreeNode root = new PersoTreeNode(temp);
     
            tree = new JTree(root, false);
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
     
            tree.addTreeSelectionListener(this);
     
            JScrollPane scrolPane = new JScrollPane(tree);
            JPanel pane = new JPanel(new BorderLayout());
     
            pane.add(scrolPane, BorderLayout.WEST);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            setContentPane(pane);
            //super.pack();
            setVisible(true);
    J'implémente la fonction valueChanged de l'interface TreeSelectionListener pour mon JTree : c'est elle qui dit quoi faire lors d'un click sur un noeud du JTree (autrement dit, c'est elle qui rafraîchit ma fenêtre).
    Code Rafraîchissement de la fenêtre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public void valueChanged(TreeSelectionEvent e) {
            /* Code lorsque d'une séléction d'un noeud.
             */
            PersoTreeNode noeud = (PersoTreeNode) tree.getLastSelectedPathComponent();
     
            if (noeud == null) return;
     
            ClsToMatch cls = (ClsToMatch) noeud.getUserObject();
     
            getContentPane().add(cls.getTable(), BorderLayout.CENTER);
            validate();
            ((JPanel)getContentPane()).setOpaque(true);
        }
    Enfin, voici la fonction qui fournit la JTable à afficher.
    Code Création de la JTable : 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
        public JTable getTable() {
            if (table == null) initTable();
            return table;
        }
        public void initTable() {
     
            TableModel model = new AbstractTableModel() {
                                    Vector slots = new Vector(getDirectTemplateSlots());
                                    boolean empty = !(slots.size() > 0);
                                    public int getColumnCount() {return (empty)? 1 : 2;}
                                    public int getRowCount() {return (empty)? 1 : slots.size();}
                                    public Object getValueAt(int row, int col) {
                                        if (empty) return "Pas d'attributs";
                                        else {
                                            if (col == 0) return ((Slot) slots.get(row)).getName();
                                            else return new Integer(1);
                                        }
                                    }
                                };
     
            table = new JTable(model);
            table.getTableHeader().setReorderingAllowed(false);
        }
    Je suis pas sûr que le code du TableModel avance à grand chose...
    Comme je le disais, si je recréé la JTable à chaque appel de la fonction getTable(), ça fonctionne.

    J'ai tenté de mettre des validate(), invalidate(), etc., donc ce code est une des variantes testées (qui ne marche pas...).

    J'espère que ça vous aidera.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Bon ben, je crois que j'ai trouvé ce qu'il me fallait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public JTable getTable() {
            if (table == null) initTable();
            else table.setEnable(true);
     
            return table;
        }
    La JTable était automatiquement mise en setEnable(false) quand je l'enlevais du JPanel.
    C'était tout simple (enfin, j'attends de voir si d'autres comportments inattendus n'arrivent pas...). Cela dit, je ne sais pas ce que ça va donner si je mets ma JTable dans un JScrollPane...

    Je tag "Résolu", mais toute information sur les validate(), repaint(), update(), etc., est la bienvenue, car j'avoue que même avec les tutos java, j'ai du mal à comprendre ce qu'il faut utiliser et quand...

    Bonne continuation à tous.
    ++

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut Erreur ???
    Re-,

    bon ben, j'ai détagué "Résolu"...
    J'ai voulu tenter de mettre ma JTable dans un JScrollPane : problèmes d'affichages...

    J'ai voulu revenir ce que j'avait fait quelques minutes plus tôt...ça marche plus

    Comprends pas. Je sais pas si je me suis trop emballé tout à l'heure, ou si j'ai enlevé une ligne qui me parraissait anodine (mais qui ne l'était pas) en nettoyant le code. En tout cas, même problème.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Décidément, je parle tout seul...
    C'est ça de bloquer trop longtemps sur son PC.

    Donc (si ça intéresse quelqu'un), le "else table.setEnable(true)"; ne sert à rien...
    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
        public void valueChanged(TreeSelectionEvent e) {
            /* Code lorsque d'une séléction d'un noeud.
             */
            PersoTreeNode noeud = (PersoTreeNode) tree.getLastSelectedPathComponent();
     
            if (noeud == null) return;
     
            ClsToMatch cls = (ClsToMatch) noeud.getUserObject();
     
            if (table != null) getContentPane().remove(table);
     
            table = cls.getTable();
     
            getContentPane().add(table, BorderLayout.CENTER);
          validate();
          repaint();
        }
    Voilà. C'est (encor une fois) tout simple
    J'ai surligné ce qui me semble important (ce sans quoi, ça ne semble pas marcher correctement).
    Bonne continuation à tous.

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

Discussions similaires

  1. Mise à jours d'un arrière plan de JFrame + capture d'écran
    Par cysboy dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 18/02/2008, 09h15
  2. [Swing][JTable] Mise à jour données
    Par [Nean] dans le forum Composants
    Réponses: 1
    Dernier message: 04/05/2007, 09h21
  3. [SWING] Mise a jour de l'interface dans les événements
    Par woods dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 23/11/2005, 15h46
  4. [Stratégie] Mise à jour application SWING
    Par chr_one dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/08/2005, 15h31

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