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 :

Problèmes d'affiche du header de mon JTable avec un Model


Sujet :

Composants Java

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut Problèmes d'affiche du header de mon JTable avec un Model
    Bonjour,

    j'ai dans mon appli, un JTable danns un JScrollPane. Mais mon JSCrollPane ne s'affiche qu'apres avoir cliqué quelque part...

    Avez-vous une idée d'ou peut venir le problème ?

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Tu n'ajouterais pas ton JScrollPane dans une fenêtre déjà visible ?
    Si c'est le cas il faut le faire dans l'EDT avec SwingUtilities.invokeLater(), et eventuellement rajouter un repaint()...

    a++

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    J'ajoute mon JScrollPane dans un JPanel déja visible oui...

    Comment j'utilises ta fonction SwingUtilities.invokeLater() ?

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wichtounet
    J'ajoute mon JScrollPane dans un JPanel déja visible oui...
    Pourquoi ne pas l'ajouter dès que tu crée ton composant ?


    Citation Envoyé par wichtounet
    Comment j'utilises ta fonction SwingUtilities.invokeLater() ?
    Il suffit de lui passer un objet Runnable en paramètre. Le code de la méthode run() sera alors exécuté dans l'EDT dès que possible.
    Cela permet d'éviter d'avoir des conflits de concurrence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilities.invokeLater( new Runnable() {
    	public void run() {
    		panel.add(...);
    		panel.revalidate();
    		panel.repaint();
    	}
    });
    Dans ton cas il faut rajouter un revalidate()/repaint() afin que le Panel soit bien mis à jours et re-affiché...

    a++

  5. #5
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par adiGuba
    Pourquoi ne pas l'ajouter dès que tu crée ton composant ?
    parce que le contenu du jtable n'est pas encore initialisé quand je crée mon JPanel...

    Je vais essayer ta technique, et je te redis

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wichtounet
    parce que le contenu du jtable n'est pas encore initialisé quand je crée mon JPanel...
    C'est pourquoi il faut utiliser un TableModel

    a++

  7. #7
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ca voudrait dire que je pourrais initialiser mon tableau au départ en fonction d'un modele et ensuite charger à l'intérieur les données que je veut ?

    P.S. Ensuite j'aurais besoin de pouvoir changer les données du tableau par des données plus fraiches... Est ce que je dois bel et bien me tourner vers l'optique d'un tableModel ?

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Oui...

    Tu travailles sur ton modèle de données, qui renseigne des changements, et ce dernier se mets à jours...

    Je te conseille d'étendre AbstractTableModel qui gère les listener et les méthodes fireXXX()...


    Je dois avoir un bout de code quelques part si tu veux...

    a++

  9. #9
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je prendrais ton bout de code avec plaisir, merci pour ton aide

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Ca donne quelque chose du style (j'ai supprimé le code spécifique qui ne te servirait pas) :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class MyTableModel extends AbstractTableModel {
     
        private static final int FILE_NAME = 0;
        private static final int DATE	= 1;
        private static final int STATUS = 2;
        private String[] columnNames = {"Fichier", "Date", "Status"};
     
        private List rows = new ArrayList();
     
     
     
     
        // Méthodes de l'interface TableModel
     
        public int getColumnCount() {
            return this.columnNames.length;
        }
     
        public String getColumnName(int column) {
            return this.columnNames[column];
        }
     
        public int getRowCount() {
            return this.rows.size();
        }
     
        public Object getValueAt(int row, int column) {
            // On récupère l'élément de la ligne courante :
            FileInfo info = (FileInfo) this.rows.get(row);
            Object value = null;
     
            if (info!=null) {
                // Et on récupère le champs souhaité
    	        switch (column) {
    	            case FILE_NAME:
    	                value = info.getName();
    	                break;
    	            case DATE:
    	                value = info.getDate();
    	                break;
    	            case STATUS:
    	                value = info.getStatus();
    	                break;
    	        }
            }
            return value;
        }
     
        public boolean isCellEditable(int row, int column) {
            // Aucune cellule éditable
            return false;
        }  
     
     
     
     
        // Méthodes permettant d'ajouter/supprimer des éléments :
     
        public void add(FileInfo info) {
            this.rows.add(info);
            int index = this.rows.size() - 1;
            super.fireTableRowsInserted(index, index);
        }
     
        public void remove(int index) {
            this.rows.remove(index);
            super.fireTableRowsDeleted(index, index);
        }
     
        public void clear() {
            this.rows.clear();
            super.fireTableDataChanged();
        }
    }

    Le fait d'étendre AbstractTableModel t'évite d'avoir à implémenter les methodes add/removeTableModelListener(), mais en plus cette classe fournit un ensemble de méthode fireXXXXX() qui permettent d'envoyer des evenements lorsque tu modifies ton modèle...

    Il ne reste plus qu'à modifier quelques méthodes pour le nom des colonnes et les données elles-mêmes.
    Dans ce cas j'utilise un liste d'objet perso, et la méthode getValueAt() me permet de renvoyer la bonne valeur pour la colonne. Chaque objet contenant les information d'une ligne de mon tableau.
    Tu pourrais également faire avec un tableau imbriqué mais je trouve cela plus complexe à gérer...

    Si ton tableau doit être editable, il faut également redéfinir la méthode setValueAt() (qui ne fait rien par défaut).

    Ensuite il faut te créer les méthodes pour modifier les données de ton modèle (add(), remove() et clear() dans mon code). Le plus important étant de bien faire appel à la méthode fireXXX() correspondante pour que la JTable (et eventuellement d'autre objet) soit bien avertit des changements...


    a++

  11. #11
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Merci beaucoup 8)

    Je n'aurai pas besoin de tout, car quand je change quelque chose, je change tout le tableau directement.

    En plus, la seule chose que je récupere ensuite sur ce tableau est l'index qui est selectionné...

    Je vais essayer d'implémenter ce modele ce soir et je te redis

  12. #12
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Est ce que quelque chose comme ca pourrait marcher ? :

    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
    public class MyModel extends AbstractTableModel{
        private String[] columnHeader = {/* Je mets pas car ca prend pas mal de lignes ^^ */}
     
        private Object[][] rows = null;
     
    	public Object getValueAt(int arg0, int arg1) {
     
    		return rows[arg0][arg1];
    	}
     
        public int getColumnCount() { 
            return this.columnHeader.length; 
        } 
     
        public String getColumnName(int column) { 
            return this.columnHeader[column]; 
        } 
     
        public int getRowCount() { 
            return this.rows.length;
        } 
     
        public boolean isCellEditable(int row, int column) { 
            // Aucune cellule éditable 
            return false; 
        }  
     
        public void setData(Object[][] newData){
        	rows = newData;
                    super.fireTableDataChanged();
        }
    }
    La fonction setData me servira à changer tout le tableau, car c'est la seule modification que je ferai sur mon JTable.

  13. #13
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    C'est bon ca marche

    Merci beaucoup de m'avoir aidé ainsi

    en plus c'est drolement plus propre

    et ca facilite nettement ma méthode de rafraichissement...

    que d'avantage dans une si petit chose ^^

  14. #14
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Par contre il n'affiche plus le header, tu as une idée d'ou ca pourrait venir ?

  15. #15
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Depuis que j'ai fait mon modele, le header ne s'affiche plus...

    voila le code de mon tableModel :
    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
    import javax.swing.table.AbstractTableModel;
     
    public class MyModel extends AbstractTableModel{
    	private static final long serialVersionUID = 8083956857937064934L;
     
    	private String[] columnHeader = {Constantes.LANGUAGE_PROPERTIES.getProperty("header0"),Constantes.LANGUAGE_PROPERTIES.getProperty("header1"), Constantes.LANGUAGE_PROPERTIES.getProperty("header2"),Constantes.LANGUAGE_PROPERTIES.getProperty("header3")};
        private Object[][] rows = new Object[0][0];
     
    	public Object getValueAt(int arg0, int arg1) {
     
    		return rows[arg0][arg1];
    	}
     
        public int getColumnCount() { 
            return this.columnHeader.length;
        } 
     
        public String getColumnName(int column) { 
            return this.columnHeader[column]; 
        } 
     
        public int getRowCount() { 
            return this.rows.length;
        } 
     
        public boolean isCellEditable(int row, int column) { 
            // Aucune cellule éditable 
            return false; 
        }  
     
        //Fonction qui va s'occupper de remettre à jour tout mon tableau et qui va mettre 
        //à jour aussi l'affichage
        public void setData(Object[][] newData){
        	rows = newData;
        	super.fireTableDataChanged();
        }
    }
    et je fais tout simplement
    GuiMain.model.setData(Functions.messagesList);

    pour mettre les données à l'intérieur... Tout marche, je peut changer les données quand je veut mais le header ne s'affiche pas

    Quelqu'un aurait il une idée du pourquoi du comment ?

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ta JTable est bien dans un JScrollPane ?

    Le contenu de ton attribut columnHeader est-il correct ?

    a++

  17. #17
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    C'était bien ca , le fichier properties n'était pas encore chargé(Je sais pas pourquoi), mais maintenant ca marche...

    merci

    Encore une chose, est ce qu'il y a une méthode pour interdire à l'utilisateur d'intervertir les colonnes ?

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

Discussions similaires

  1. [iOS 3.x] Problème d'afficher l'image à partir d'un URL dans mon application iPhone.
    Par cybergod dans le forum Objective-C
    Réponses: 2
    Dernier message: 19/04/2013, 16h58
  2. Afficher les headers d'une JTable
    Par jaira dans le forum Composants
    Réponses: 2
    Dernier message: 14/07/2011, 10h21
  3. Réponses: 5
    Dernier message: 11/03/2011, 11h59
  4. Réponses: 8
    Dernier message: 15/11/2008, 10h09
  5. Réponses: 3
    Dernier message: 21/05/2007, 13h42

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